我有一个看起来像这样的控制器:
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”在第二个。
两件事:为什么只读第二个上的“否”而不是“你好”和“否”?还有为什么我会收到这个错误?
感谢您的帮助!
答案 0 :(得分:1)
您希望将“数据”存储为行
中的数组在Rails模型中添加行
serialize :data, Array
在视图中
text_field_tag 'row[data][]'
你只得到'不'因为form for不知道它的数组所以,它选择了最后一个你得到这个错误因为rails不知道你想把它存储为数组,它除了一个字符串但是得到了一个阵列。
答案 1 :(得分:1)
您的问题的答案:
只读“No”是你在最后一个“Data”text_field中的输入,因为在form_for中生成的两个text_field将它们的输入值保存在相同的params键中,即params [:row] [:数据]。然后会发生的事情是保存到params [:row] [:data]键的最新值会覆盖它以前的任何值。
发生错误undefined method stringify_keys' for ["data", "No"]:Array
是因为您创建了两个名称相同的text_fields:data。提交表单时,正在提交一个数组而不是Rails在使用text_field时所期望的字符串。
解决您的问题:
这似乎是使用嵌套模型表单的理想用例。根据您的代码,它看起来像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。不过基于你的代码,似乎已经是你正在做的事情了。