#ruby-on-rails #forms #checkbox #parameters
#ruby-on-rails #формы #флажок #параметры
Вопрос:
Параметры из Rails debugger показывают
{"utf8"=>"✓",
"authenticity_token"=>"m2NMruoFRr6lpsuVMK9UthlY0bsJsPmf1LWce2uKaH4=",
"signup_id"=>"5",
":item_name"=>["Electric drill",
"Screwdriver set"],
"commit"=>"Go!"}
Но метод создания контроллера продолжает выдавать следующую ошибку:
undefined method `each' for nil:NilClass` on the `params[:item_name]
от контроллера:
def create
params[:item_name].each do |item|
item = @signup_parent.inventories.build(inventory_params)
end
end
def inventory_params
params.require(:inventory).permit(:signup_id, {:item_name => []})
end
ОБНОВЛЕННЫЙ код контроллера (см. Ветку комментариев ниже, все еще не работает, но, надеюсь, становится ближе)
def create
params[":item_name"].each do |item|
item = @signup_parent.inventories.build(inventory_params)
end
end
def inventory_params
params.permit(:signup_id, {:item_name => []})
end
Просмотрите фрагмент кода, если он полезен:
<%= check_box_tag ":item_name[]", "#{thing}" %>
<%= hidden_field_tag :signup_id, "#{Signup.find_by_email(session[:signup_email]).id}" %>
Ответ №1:
У вас есть ":item_name"
(с кавычками и двоеточием) параметр, поэтому, я думаю, вам следует использовать его с кавычками:
params[":item_name"].each do |item|
...
И лучше обрабатывать, как он передается из конкретной формы.
Существует также проблема с inventory_params
— нет inventory
того, что вы можете потребовать, все они находятся в root. Так что я думаю, что это:
params.require(:inventory).permit(:signup_id, {:item_name => []})
не будет работать. Вы можете использовать обычные параметры или обработать это во внешнем интерфейсе. Однако вы можете разрешить их без require:
params.permit(:signup_id, {':item_name' => []})
или:
params.permit!
Обновление: вы должны изменить свои файлы на
<%= check_box_tag "inventory[item_name][]", "#{thing}" %>
<%= hidden_field_tag "inventory[signup_id]", "#{Signup.find_by_email(session[:signup_email]).id}" %>
Затем параметры изменяются, чтобы вы могли использовать params.permit(:signup_id, {:item_name => []})
Комментарии:
1. Привет, большое спасибо! Это решило проблему, но не полностью. Теперь у меня две проблемы: 1)
:signup
Параметр по какой-либо причине больше не передается через ({"utf8"=>"✓", "authenticity_token"=>"m2NMruoFRr6lpsuVMK9UthlY0bsJsPmf1LWce2uKaH4=", ":item_name"=>["Vacuum", "Air mattress"], "commit"=>"Go!"}
). 2) Теперь все не разрешеноUnpermitted parameters: utf8, authenticity_token, :item_name, commit
2. Чтобы исправить это, вы можете использовать
params.permit!
, чтобы разрешить все параметры, но, возможно, вы вообще не могли использовать строгие параметры.3. Мне странно, что нет способа сделать это без использования сильных параметров. Но в любом случае
permit!
это тоже не работает. По какой-то причине:signup_id
отказывается проходить …. (хотя все остальное делает). Я добавил код просмотра, если это полезно4. Да, вы должны правильно передавать параметры в действие. Покажите мне, где вы это называете.
5. Да, но как насчет другого.