我正在尝试为数组写一个表单
<%= 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的任何想法,以便可以保存用户信息吗?
答案 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 %>