simple_form has_many 通过不允许的参数
simple_form has_many through unpermitted parameters
我在为 create/update 设置简单 for 时遇到了一些问题。表格如下:
<%= simple_form_for( setup_menu(@menu) ) do |f| %>
<%= f.input :user_id, :as => :hidden %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.association :recipes %>
<%= f.button :submit %>
<% end %>
以下是三个模型:
class Menu < ActiveRecord::Base
has_many :courses
has_many :recipes, through: :courses
accepts_nested_attributes_for :recipes,
reject_if: :all_blank
accepts_nested_attributes_for :courses,
reject_if: :all_blank
end
class Recipe < ActiveRecord::Base
has_many :courses
has_many :menus, through: :courses
accepts_nested_attributes_for :menus
end
class Course < ActiveRecord::Base
belongs_to :menu
belongs_to :recipe
end
这是 menus_controller 中的参数定义:
def menu_params
params.require(:menu).permit(:user_id, :name, :description, :recipe_ids, :course_ids, :courses, :recipes,
recipes_attributes: [:id, :recipe_id, :_destroy], courses_attributes: [:id, :recipe_id, :menu_id, :_destroy]
)
end
我在 recipe_ids 上不断收到不允许的参数错误。
Started PATCH "/menus/1" for ::1 at 2015-10-01 20:54:56 -0500
Processing by MenusController#update as HTML
Parameters: {"utf8"=>"√", "authenticity_token"=>"i/7E27BWul9trszURDu1z8PtsHaG54byG9JOlEp3mn2oQZVveM2mSP4XTLzjWKAK+BNvwoi/pqBbQPrPTcnaDw==", "menu"=>{"name"=>"Menu 1", "description"=>"First test menu", "recipe_ids"=>["", "1", "3", "4"]}, "
commit"=>"Update Menu", "id"=>"1"}
Menu Load (1.0ms) SELECT "menus".* FROM "menus" WHERE "menus"."id" = ? LIMIT 1 [["id", 1]]
Unpermitted parameter: recipe_ids
(1.0ms) begin transaction
(0.0ms) commit transaction
Redirected to http://localhost:3000/menus/1
Completed 302 Found in 11ms (ActiveRecord: 2.0ms)
我确定我错过了一些简单的事情。我为此绞尽脑汁一整天。有人可以帮忙吗?
我知道这很简单。这解决了整个问题。
params.require(:menu).permit(:user_id, :name, :description, { :recipe_ids => [] } )
补充一下你的答案,你的结构有很多问题。
对象
您正在呼叫 setup_menu
;这应该 至少 在你的控制器中调用(除非你使用的是部分......即使这样它也应该作为本地变量传递)。
<%= simple_form_for @menu do |f| %>
<%= f.hidden_field :user_id %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.association :recipes %>
<%= f.button :submit %>
<% end %>
这必须通过适当的控制器操作来支持。同样,如果您在 partial
之类的地方使用它,您将能够在定义 @menu
:
的同时分配操作
#app/controllers/menus_controller.rb
class MenusController < ApplicationController
def new
@menu = setup_menu x
end
end
关联数据
因为您使用的是 has_many :recipes
关联,所以您应该能够在强参数中设置 :recipes
。否则,您的 recipe_ids
应该没问题,但我认为您在括号中的封装不正确:
params.require(:menu).permit(:user_id, :name, :description, recipe_ids: [])
顺便说一句,如果您设置了 has_and_belongs_to_many
关系,您将能够按如下方式传递 recipes
:
params.require(:menu).permit(:user, :name, :description, :recipes)
我看不出为什么这对您的 has_many :through
不起作用
定义
最后,您应该能够在模型中为 accepts_nested_attributes_for
:
设置多个定义
#app/models/menu.rb
class Menu < ActiveRecord::Base
has_many :courses
has_many :recipes, through: :courses
accepts_nested_attributes_for :recipes, :courses, reject_if: :all_blank
end
保持代码高效的最重要、最简单的方法之一是使其具有可读性。以上是一个例子 - repeating yourself unnecessarily 不仅会使您的代码混乱,而且会妨碍有效的管理。
我在为 create/update 设置简单 for 时遇到了一些问题。表格如下:
<%= simple_form_for( setup_menu(@menu) ) do |f| %>
<%= f.input :user_id, :as => :hidden %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.association :recipes %>
<%= f.button :submit %>
<% end %>
以下是三个模型:
class Menu < ActiveRecord::Base
has_many :courses
has_many :recipes, through: :courses
accepts_nested_attributes_for :recipes,
reject_if: :all_blank
accepts_nested_attributes_for :courses,
reject_if: :all_blank
end
class Recipe < ActiveRecord::Base
has_many :courses
has_many :menus, through: :courses
accepts_nested_attributes_for :menus
end
class Course < ActiveRecord::Base
belongs_to :menu
belongs_to :recipe
end
这是 menus_controller 中的参数定义:
def menu_params
params.require(:menu).permit(:user_id, :name, :description, :recipe_ids, :course_ids, :courses, :recipes,
recipes_attributes: [:id, :recipe_id, :_destroy], courses_attributes: [:id, :recipe_id, :menu_id, :_destroy]
)
end
我在 recipe_ids 上不断收到不允许的参数错误。
Started PATCH "/menus/1" for ::1 at 2015-10-01 20:54:56 -0500
Processing by MenusController#update as HTML
Parameters: {"utf8"=>"√", "authenticity_token"=>"i/7E27BWul9trszURDu1z8PtsHaG54byG9JOlEp3mn2oQZVveM2mSP4XTLzjWKAK+BNvwoi/pqBbQPrPTcnaDw==", "menu"=>{"name"=>"Menu 1", "description"=>"First test menu", "recipe_ids"=>["", "1", "3", "4"]}, "
commit"=>"Update Menu", "id"=>"1"}
Menu Load (1.0ms) SELECT "menus".* FROM "menus" WHERE "menus"."id" = ? LIMIT 1 [["id", 1]]
Unpermitted parameter: recipe_ids
(1.0ms) begin transaction
(0.0ms) commit transaction
Redirected to http://localhost:3000/menus/1
Completed 302 Found in 11ms (ActiveRecord: 2.0ms)
我确定我错过了一些简单的事情。我为此绞尽脑汁一整天。有人可以帮忙吗?
我知道这很简单。这解决了整个问题。
params.require(:menu).permit(:user_id, :name, :description, { :recipe_ids => [] } )
补充一下你的答案,你的结构有很多问题。
对象
您正在呼叫 setup_menu
;这应该 至少 在你的控制器中调用(除非你使用的是部分......即使这样它也应该作为本地变量传递)。
<%= simple_form_for @menu do |f| %>
<%= f.hidden_field :user_id %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.association :recipes %>
<%= f.button :submit %>
<% end %>
这必须通过适当的控制器操作来支持。同样,如果您在 partial
之类的地方使用它,您将能够在定义 @menu
:
#app/controllers/menus_controller.rb
class MenusController < ApplicationController
def new
@menu = setup_menu x
end
end
关联数据
因为您使用的是 has_many :recipes
关联,所以您应该能够在强参数中设置 :recipes
。否则,您的 recipe_ids
应该没问题,但我认为您在括号中的封装不正确:
params.require(:menu).permit(:user_id, :name, :description, recipe_ids: [])
顺便说一句,如果您设置了 has_and_belongs_to_many
关系,您将能够按如下方式传递 recipes
:
params.require(:menu).permit(:user, :name, :description, :recipes)
我看不出为什么这对您的 has_many :through
定义
最后,您应该能够在模型中为 accepts_nested_attributes_for
:
#app/models/menu.rb
class Menu < ActiveRecord::Base
has_many :courses
has_many :recipes, through: :courses
accepts_nested_attributes_for :recipes, :courses, reject_if: :all_blank
end
保持代码高效的最重要、最简单的方法之一是使其具有可读性。以上是一个例子 - repeating yourself unnecessarily 不仅会使您的代码混乱,而且会妨碍有效的管理。