Rails:提交一系列子元素

时间:2015-02-18 04:25:17

标签: ruby forms ruby-on-rails-4

我正在尝试提交一个应该包含子元素数组的表单。我不确定我是否正确使用它。有人可以帮我重构吗?

我有几个模型useritem。用户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条记录被保存,这意味着 - 数据不会作为对象数组传递。我如何让它工作?

2 个答案:

答案 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