Параметры равны нулю, даже если журнал показывает прохождение

#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. Да, но как насчет другого.