创建多个params问题

时间:2013-12-27 04:05:13

标签: ruby-on-rails ruby

我有一个看起来像这样的控制器:

def new
   @columns = Column.where(:table_id => @table.id)
   @row = Row.new(id: @table.id)
end

def create

   row_params.each do |row_param|
      @row = Row.new(row_param)
      @row.column_id = params["column_id"]

      if @row.save
         redirect_to collection_rows_path, notice: 'item was successfully created.' 
      else
         render action: 'new'
      end
   end
end

我的表格如下:

<%= form_for [@table, @row] do |f| %>

   <% @columns.each do |column| %>
       <%= column.id %>
       <%= hidden_field_tag :column_id, column.id %>
       <%= f.label :data %><br>
       <%= f.text_field :data %>
   <% end %>

   <%= f.submit %>
<% end %>

基本上,我正在尝试发送多个参数并将它们与列一起插入。但我一直收到这个错误:

undefined method stringify_keys'表示[“data”,“No”]:Array`当有两列时,意味着有两个文本字段,我在第一个中插入“Hello”,并且“No”在第二个。

两件事:为什么只读第二个上的“否”而不是“你好”和“否”?还有为什么我会收到这个错误?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您希望将“数据”存储为行

中的数组

在Rails模型中添加行

 serialize :data, Array

在视图中

text_field_tag 'row[data][]'

你只得到'不'因为form for不知道它的数组所以,它选择了最后一个你得到这个错误因为rails不知道你想把它存储为数组,它除了一个字符串但是得到了一个阵列。

答案 1 :(得分:1)

您的问题的答案:

  1. 只读“No”是你在最后一个“Data”text_field中的输入,因为在form_for中生成的两个text_field将它们的输入值保存在相同的params键中,即params [:row] [:数据]。然后会发生的事情是保存到params [:row] [:data]键的最新值会覆盖它以前的任何值。

  2. 发生错误undefined method stringify_keys' for ["data", "No"]:Array是因为您创建了两个名称相同的text_fields:data。提交表单时,正在提交一个数组而不是Rails在使用text_field时所期望的字符串。

  3. 解决您的问题:

    这似乎是使用嵌套模型表单的理想用例。根据您的代码,它看起来像Row belongs_to Table。因此,在您的Table模型中,您需要添加以下代码:

    #app/models/table.rb
    accepts_nested_attributes_for :row
    

    然后在RowsController中添加以下代码:

    #app/controllers/rows_controller.rb
    
    def new
      @columns = Column.where(:table_id => @table.id)
      @columns.each do |column| 
        @table.rows.build(column_id: column.id)
      end
    end
    
    def create
      @table = Table.new(table_params)
      if @table.save
        redirect_to collection_rows_path, notice: 'item was successfully created.'
      else
        render :new
      end
    end
    
    private
    def table_params
      params.require(:table).permit(rows_attributes: [:data, :column_id])
    end
    

    然后在“行#new”视图中

    #app/views/rows/new.html.erb
    
    <%= form_for @table, url: rows_path ,method: :post do |f| %>
      <%= f.fields_for :rows do |r| %>
        <%= r.object.column.name %>
        <%= r.hidden_field :column_id, value: r.object.column_id %>
        <%= r.label :data %><br>
        <%= r.text_field :data %>
      <% end %>
    
      <%= f.submit %>
    <% end %>
    

    上面的代码将允许您根据表的列数为列创建多个行。如果@table还没有@columns,这将无效。这假设你已经为@table创建了@columns。不过基于你的代码,似乎已经是你正在做的事情了。