【问题标题】:Rails 4 Nested Resources, Forms, strong paramsRails 4 嵌套资源、表单、强参数
【发布时间】:2015-02-18 15:15:04
【问题描述】:

我正在尝试创建一个锻炼追踪器。我有这些嵌套资源

Routes.rb

resources :days do
  resources :workouts
  resources :meals
end

我的模型看起来不错:

锻炼.rb

class Workout < ActiveRecord::Base
  has_many :exercises
  belongs_to :day
end

Day.rb

class Day < ActiveRecord::Base
  has_many :workouts
  has_many :meals
  accepts_nested_attributes_for :workouts, :allow_destroy => true
  accepts_nested_attributes_for :meals, :allow_destroy => true
end

问题出在我尝试创建新锻炼时..

../views/workouts/_form.html.haml

= form_for([@day, @workout]), html: {class: 'form-horizontal'}) do |f|
  = f.input :workout, label: "What did you work out", input_html: { class: "form-control"}
  = f.input :mood, label: "How do you feel", input_html: { class: "form-control"}
  = f.hidden_field :day_id, value: params[:day_id], input_html: { class: "form-control"}

  = f.submit

我似乎无法保存锻炼与锻炼相关的 :day_id,尽管使用强参数来接收它们。

锻炼控制器.rb

private

def workout_params
  params.require(:workout).permit(:day_id, :name, :mood)
end

def find_day
  @day = Day.find(params[:day_id])
end

相反,保存的是 :day_id 的 nil

Rails 控制台:

Workout id: 11, name: "Hey", mood: "no", day_id: nil, created_at: "2014-12-19 14:53:29", updated_at: "2014-12-19 14:53:29"

帮忙?

PS - 我试过了

= form_for([@day, @workout]), as: :foo, html: {class: 'form-horizontal'}) do |f|
  = f.input :workout, label: "What did you work out", input_html: { class: "form-control"}
  = f.input :mood, label: "How do you feel", input_html: { class: "form-control"}
  = f.hidden_field :day_id, value: params[:day_id], input_html: { class: "form-control"}

  = f.submit

然后

def workout_params
  params.require(:foo).permit(:day_id, :name, :mood)
end

但它只是一直说 :foo 参数是空的

【问题讨论】:

  • 这行得通吗? Day.find(params[:workout][:day_id])
  • 您可以运行rake routes 并发布报告(或至少包含白天和锻炼路线的部分)吗?

标签: ruby-on-rails ruby nested-forms strong-parameters


【解决方案1】:

您的路线设置方式,我假设 day_id 正在作为 url 参数传递:

/days/:day_id/workouts

如果是这样,那么您无需担心表单中的@day,也无需担心workout_params 中的day_id

表格:

= form_for @workout, html: {class: 'form-horizontal'}) do |f|
    = f.input :workout, label: "What did you work out", input_html: { class: "form-control"}
    = f.input :mood, label: "How do you feel", input_html: { class: "form-control"}

    = f.submit

控制器:

def create
   @workout = @day.workouts.new(workout_params)
   ....
end

private

def workout_params
     params.require(:workout).permit(:name, :mood)
end

def find_day
    @day = Day.find(params[:day_id])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2014-02-08
    相关资源
    最近更新 更多