我正在尝试提交一个应该包含子元素数组的表单。我不确定我是否正确使用它。有人可以帮我重构吗?
我有几个模型user
和item
。用户has_many :items
。
发送用户和项目信息的表单如下所示 -
<%= form_for(@user) do |f| %>
<% f.text_field :name %>
<% f.fields_for :items do |item| %>
<% item.text_field :name %>
<% item.text_field :price %>
<% end %>
<% end %>
我的控制器中有以下内容 -
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
@items = @user.items.build(item_params)
if @items.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
end
format.html { redirect_to @user, notice: 'User was successfully created. But there was a problem saving the items.' }
else
format.html { render action: 'new' }
format.json { render json: @userd.errors, status: :unprocessable_entity }
end
end
end
private
def user_params
params.require(:user).permit(:name)
end
def item_params
params.require(:user).require(:item).permit(:name, :price)
end
当我保存user
时,只有items
的1条记录被保存,这意味着 - 数据不会作为对象数组传递。我如何让它工作?
答案 0 :(得分:2)
现在看起来你只是告诉Rails构建一个item
对象。您的表单会传递一个项目的两个参数,而在您的控制器中,您只需拨打build
一次,因此@items
只会被设置为等于Item
返回的单个build
}。除非您的表单中隐藏的部分未显示,否则您只需为user
的{{1}}设置一组选项。如果您的目标是使用具有相同参数的许多items
数组,那么最快的解决方法就是在items
操作的逻辑中执行此操作。有很多方法可以实现(这是一种简单的方法):
create
如果您要从包含多个唯一@items = []
x.times { @items << @user.items.build(item_params) }
的表单发送请求,则必须向表单添加更多字段,因为目前您只发送一组参数。
答案 1 :(得分:1)
您的代码中几乎没有更正。
在users_controller
def new
@user = User.new
3.times do #this will generate three records of items
@user.items.build
end
end
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
else
format.html { render action: 'new' }
format.json { render json: @userd.errors, status: :unprocessable_entity }
end
end
end
private
def user_params
params.require(:user).permit(:name,items_attributes: [:name,price])
end