一对一关系的嵌套属性

时间:2011-12-01 09:32:40

标签: ruby-on-rails ruby-on-rails-3 nested-attributes

我有一家公司有一个订阅。现在我想要一个表单来添加或编辑公司和订阅,所以我使用“accepts_nested_attributes_for”。这是公司模型的一部分:

  has_one :subscription, :dependent => :destroy
  accepts_nested_attributes_for :subscription

这是(部分)订阅模型:

  belongs_to :company

在控制器中我有这个:

  def new
    @company = Company.new(:subscription => [Subscription.new])
  end

  def create
    @company = Company.new(params[:company])

    if @company.save
      redirect_to root_path, notice: I18n.t(:message_company_created)
    else
      render :action => "new"
    end
  end

  def edit
    @company = Company.find(params[:id])
  end

  def update
    @company = Company.find(params[:id])

    if @company.update_attributes(params[:company])
      redirect_to root_path, :notice => I18n.t(:message_company_updated)
    else
      render :action => "edit"
    end

  end

表格如下:

      <%= f.fields_for(:subscription) do |s_form| %>
        <div class="field">
            <%= s_form.label I18n.t(:subscription_name) %>
        <%= s_form.text_field :name %>
      </div>
  <% end %>

这给出了两个问题:

  • 名称字段仅在公司已有订阅时在编辑表单中显示,在添加新公司时不显示
  • 编辑公司并更改订阅的名称字段时,不会保存更改。

我在这里做错了什么?

我使用的是Rails版本3.1

1 个答案:

答案 0 :(得分:2)

我认为您应该将新动作更改为:

def new
  @company = Company.new
  @company.build_subscription
end

有关详细信息,请参阅docs。然后,我认为您必须将subscription_attributes添加到公司定义的attr_accessible列表中。