Rails - 保存嵌套数组

时间:2010-10-09 00:37:36

标签: ruby-on-rails arrays nested

我能够在视图中创建嵌套数组,以发布到“创建”操作。但我不确定如何保存嵌套数组。

这是基本的创造行动,它将所有单个参数聚集在大量指定的参数中:

def create
  @post = Post.new(params[:mass_assigned])
  respond_to do |format|
    if @post.save
      format.html
    else
      format.html
    end
  end
end

但是这会返回一个nil对象错误。这可能是由于我的表单使用check_box_tag而不是使用带有漂亮魔法的check_box并导致:mass_assigned为nil。我对rails非常陌生,并且非常感谢任何导致这一点的工作。请解释如何格式化我的方法以收集各个参数然后保存它。

2 个答案:

答案 0 :(得分:0)

我不确定你的问题是只是保存一个对象还是你想序列化它 - 而你的问题是你想要注入db的你的“嵌套数组”在保存之前是扁平化的。

如果是第一个,那么请确保你有params [:mass_assigned]。您总是可以在控制器方法的顶部添加一行:

throw params

...并提交表单以查看您的可用内容并检查结构。 很高兴看到你提交的表单代码带有从日志中获取的应用程序错误的回溯

如果是第二种情况,请告诉我,我会回复你;)

答案 1 :(得分:0)

我自己一整天都在努力。如果您仍在寻找答案,并且我理解您的问题,请尝试以下示例:

a)对人名使用脚手架:字符串地址:文本,设置模型,视图等。

b)

In app/models/person.rb:
class Person < ActiveRecord::Base
        attr_accessible :address, :name
    serialize :address
end

脚手架视图对于新视图和编辑视图具有相同的_form部分。您可以通过在表单中​​添加以下代码来成功完成新操作并显示操作:

<%= form_for(@person) do |f| %>
 ...
      <%= f.fields_for :address do |address_fields| %>
        Street  : <%= address_fields.text_field :street %>
        Zip code: <%= address_fields.text_field :zip_code %>
      <% end %>
...
<% end %>

但是,编辑视图不会使用上述代码使用模型中的值填充文本字段。要解决这个问题,您需要从@ person.address哈希中提取值并明确地将其分配给文本。如果您使用的是scaffold视图,则表单通常使用_form partial进行渲染。这使事情复杂化,因为添加代码以提取地址组件的值会破坏新对象。你可以通过在Person.new期间初始化地址哈希或检查nil来解决这个问题,如下所示:

  <%= f.fields_for :address do |address_fields| %>
    Street  : <%= address_fields.text_field :street,:value => @person.address.nil? ? "":@person.address["street"] %>
    Zip code: <%= address_fields.text_field :zip_code,:value => @person.address.nil? ? "":@person.address["zip_code"] %>
  <% end %>

希望有所帮助。