【问题标题】:Rails: Submitting an array of child elementsRails:提交子元素数组
【发布时间】:2015-02-18 04:25:17
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    现在您似乎只告诉 Rails 构建一个 item 对象。你的表单传递了一个项目的两个参数,并且在你的控制器中你调用了一次build,所以@items只被设置为等于build返回的单个Item。除非它们是您未显示的表单的隐藏部分,否则您似乎只是为useritems 设置了一组选项。如果您的目标是拥有许多具有相同参数的items 数组,那么最快的解决方法就是在您的create 操作的逻辑内执行此操作。有很多方法可以实现(这里是一种简单的方法):

    @items = []
    x.times { @items << @user.items.build(item_params) }
    

    如果您希望从具有多个唯一 items 的表单发送请求,则必须在表单中添加更多字段,因为目前您只发送一组参数。

    【讨论】:

    • 不错!知道如何找到“x”吗?还是有其他选择?我可以将 x 作为常数,但在某些情况下可能并非如此。
    • 另外,我在@hours.save 行得到了一个“#<0x007fdd7741a760>
    【解决方案2】:

    在您的代码中需要进行一些更正。

    在你的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多