Параметры не считываются, хотя кажется, что они переданы

#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
 

Хотя это не обязательно лучший способ сделать это (я бы посоветовал ознакомиться с вашими помощниками по форме активной записи), это должно решить вашу проблему.