Rails3嵌套属性在保存操作中使用父值

时间:2011-11-21 11:38:38

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

我在rails3应用程序中使用了一个简单的嵌套表单。我试图找出如何在保存时将父模型中的值保存到子项中。

class Radcheck < ActiveRecord::Base
  set_table_name 'radcheck'
  attr_accessible :attribute_name, :username, :value, :op
  belongs_to :raduser  
end

class Raduser < ActiveRecord::Base
  has_many :radcheck, :dependent => :destroy
  accepts_nested_attributes_for :radcheck  
end

我的表格:

<%= form_for @raduser do |f| %>  
  <p>  
    <%= f.label :username %><br />  
    <%= f.text_field :username %>  
  </p>  
  <%= f.fields_for :radcheck do |builder| %>  
  <li>  
    <%= builder.label :attribute_name %><%= builder.text_field :attribute_name %>  

  </li>  
  <% end %>  
  <p><%= f.submit "Submit" %></p>  
<% end %>

我想要做的是在保存时将Raduser.username值保存到radcheck表中。对于每条记录。

我已尝试在控制器中放置一些内容,但这并不适合我们。

- 更新 -

在我的radcheck控制器中,我已尝试过(作为测试),但价值不会保存。

def create
      @radcheck = Radcheck.new(params[:radcheck])
      @radcheck.username = '123'
      respond_to do |format|
        if @radcheck.save

          format.html { redirect_to @radcheck, notice: 'Radcheck was successfully created.' }
          format.json { render json: @radcheck, status: :created, radcheck: @radcheck }
        else
          format.html { render action: "new" }
          format.json { render json: @radcheck.errors, status: :unprocessable_entity }
        end
      end
    end

也尝试过radusers,但这给了错误。

1 个答案:

答案 0 :(得分:3)

您发布的控制器代码看起来像Radcheck控制器,对吗?如果是这样,您发布的表单将使用create类的RaduserController操作,而不是RadcheckController中的操作。这可以解释为什么你没有在radcheck行中看到用户名'123'。

如果父级和子级之间的用户名字段相同,则将这两者同步的常用方法是使用观察者或before_save回调。我将概述下面的before_save方法:

class Radcheck < ActiveRecord::Base
  set_table_name 'radcheck'
  attr_accessible :attribute_name, :username, :value, :op
  belongs_to :raduser

  before_save :sync_usernames

private

  def sync_usernames
    self.username = self.raduser.username
  end
end

我用Rails 3.1测试了这个并且它有效;但是,我知道在以前版本的Rails中访问子模型中的父模型时遇到了问题。在这些情况下,我必须将before_save操作放在父模型上,并让它迭代每个子项,以这种方式设置适当的属性。