ruby中form_for的正确语法

时间:2014-07-28 03:02:41

标签: ruby-on-rails ruby forms save

我正在尝试为数组写一个表单

<%= 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 |并且它不保存amenities_indices中的选项。有关如何重构此代码以使用f的任何想法,以便可以保存用户信息吗?

2 个答案:

答案 0 :(得分:1)

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

您正在寻找的是:收集,然后:as

答案 1 :(得分:0)

代码阻止

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

原因是,如果您致电form_for,它实质上意味着您正在调用一个巨大的代码块,其中每个attribute都需要绑定到您的表单对象,以便呈现你的params正确哈希

简而言之 - 您的form_for呈现HTML表单,保持<input>元素的名称符合您的应用程序加载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 %>