#ruby-on-rails #forms #checkbox #parameters
#ruby-on-rails #формы #флажок #параметры
Вопрос:
Я создаю форму, которая создает более одной записи для пользователя в зависимости от того, сколько элементов пользователь решает отметить в форме с помощью флажков.
В настоящее время я сталкиваюсь с ошибкой, когда param is missing or the value is empty: itemrecord
, хотя в журнале, кажется, что params
они проходят через:
{"utf8"=>"✓", "authenticity_token"=>"m2NMruoFRr6lpsuVMK9UthlY0bsJsPmf1LWce2uKaH4=", ":item_name"=>["Backpack", "Water filter"], "commit"=>"Go!"}
Модель отношения заключается в том, что User has_many :inventories
Код контроллера:
def create
@itemrecord = @current_user.inventories.build
items_to_be_saved = []
inventory_params.each do |i|
items_to_be_saved << ({ :signup_id => @current_user.id, :item_name => i })
end
if Inventory.create items_to_be_saved
flash[:success] = "Thanks!"
redirect_to root_path
else
render new_inventory_path
end
end
def inventory_params
params.require(:itemrecord).permit(:item_name)
end
Просмотр кода:
<%= form_for @itemrecord do |f| %>
<!-- In case you're wondering, the @wishlist below is basically a hash of categories of items and items. This hash is updated in the controller, and then used by multiple views to create the same table of items. -->
<% @wishlist.each do |category, list| %>
<div class="col-xs-2">
<div class="form-group box">
<h5> <%="#{category}"%> </h5>
<% list.each do |thing| %>
<%= check_box_tag ":item_name[]", "#{thing}" %>
</br>
<% end %>
</div>
</div>
<% end %>
<%= f.submit "Go!", class: "btn btn-primary btn-large btn-block" %>
</div>
<% end %>
Кстати, я также попытался изменить :item_name
на :item_names
для учета массива на основе того, что еще я прочитал в SO, но это тоже не исправило
Комментарии:
1. Изменение вашего
inventory_params
на этоparams.require(:inventory).permit(:item_name)
будет работать.2. Согласно тому, что @JKen13759 сказал ниже, это тоже не сработает
3. Вы попробовали мое предложение?
4. @James вы в конечном итоге попробовали мой ответ? Это сработало для вас?
5. вроде как … мне нужно было сделать
params.permit[:item_name]
, но потом понял, что мне действительно нужен совершенно новый атрибут. но мне понравился ваш ответ, и это помогло, поэтому я принял его.
Ответ №1:
Взгляните на свою inventory_params
функцию. Вы говорите, что вам требуется itemrecord
и разрешить item_name
атрибут. Наблюдайте:
def inventory_params
params.require(:itemrecord).permit(:item_name)
end
Однако в передаваемых параметрах нет ссылки на itemrecord
объект вообще, но есть ссылка на item_name
. Быстрое изменение вашего inventory_params
метода, удаление :itemrecord
требования и вместо этого требование :item_name
, устранит вашу проблему.
def inventory_params
params.require(:item_name)
end
Хотя это не обязательно лучший способ сделать это (я бы посоветовал ознакомиться с вашими помощниками по форме активной записи), это должно решить вашу проблему.