【问题标题】:proper syntax for a form_for in rubyruby 中 form_for 的正确语法
【发布时间】:2014-07-28 17:49:58
【问题描述】:

我正在尝试为数组编写表单

<%= form_for @user, html: {multipart:true} do |f| %>

 <%= render "shared/error_messages", object: f.object %>

<label for="user-amenities" class="top">Amenities</label>
    <ul class="group" id="user-amenities">
      <% User.amenities_list.each_with_index do |amenity, index| %>
        <li class="checkbox-li">
          <input type="checkbox" name="user_amenities_indicies[]" value="<%= index %>">
            <%= amenity %>
          </input>
        </li>
       </ul>
      <% end %>

但是我没有使用 |f|并且它没有保存设施索引中的选项。关于如何重构此代码以利用 f 以便保存用户信息的任何想法?

【问题讨论】:

    标签: ruby-on-rails ruby forms save


    【解决方案1】:

    试试 simple_form https://github.com/plataformatec/simple_form/blob/master/README.md

    你要找的是 :collection 然后 :as

    【讨论】:

      【解决方案2】:

      代码块

      您寻求的重构基本上是您需要在所有输入中使用f.

      原因是如果你调用form_for,它本质上意味着你调用了一个巨大的代码块,其中每个attribute都需要绑定到你的表单对象,以便正确地使用你的参数散列渲染

      简而言之 - 您的 form_for 呈现 HTML 表单,保持 &lt;input&gt; 元素的名称符合您的应用程序加载 params 的要求。您遇到的问题是,省略 f. 调用将使那些 inputs 超出参数的范围,从而导致您看到的问题。

      --

      保存

      如果您没有任何关联数据(我已在下面描述),您需要将您的输入包含在 f. 代码块中:

      <%= form_for @user do |f| %>
         <% User.amenities_list.each_with_index do |amenity, index| %>
            <%= f.check_box :user_amenities_indicies, index %>
         <% end %>
      <% end %>
      

      这会将user_amenities_indicies 复选框的选中值传递给您的控制器。这应该工作,并且是适合你的正确语法

      --

      fields_for

      另外一个补充是,我不知道您是否在此处尝试填充 associative 数据 - 但如果您尝试为另一个模型创建数据,您将需要使用 fields_for

      #app/controllers/users_controller.rb
      Class UsersController < ApplicationController
         def new 
            @user = User.new
            @user.user_amenities.build
         end 
      
         def create
            @user = User.new(user_params)
            @user.save
         end
      
         private
      
         def user_params
             params.require(:user).permit(:user, :params, user_amenities_attributes: [])
         end
      end
      

      这将允许您使用fields_for 创建一个表单,如下所示:

      <%= form_for @user do |f| %>
         <%= f.fields_for :user_amenities do |ua| %>
             # fields for user_amenities
         <% end %>
      <% end %>
      

      【讨论】:

      • 感谢您的帮助瑞克,非常感谢!我在保存下尝试了您的解决方案,但在“用户#edit undefined method `merge' for 0:Fixnum' 中出现了“NoMethodError”,并突出显示了“”。如果您想看一下,我的全部问题就在这里,stackoverflow.com/questions/24987176/…
      • 谢谢-让我看看!!
      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多