创建对象时不要使用引用的id

时间:2015-06-08 10:31:04

标签: ruby-on-rails

我的应用中有两个对象:user,其中包含唯一参数email_addressnode,其名称属于用户。

这是我在DB中的两个对象,节点:

class CreateNodes < ActiveRecord::Migration
  def change
    create_table :nodes do |t|
      t.string :name
      t.references :user, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

用户:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email_address, unique: true, index: true

      t.timestamps null: false
    end
  end
end

我添加节点的表单如下所示:

<%= form_for @node do |f|  %>
    <%= f.text_field :name, :class => "form-control" %>
    <%= f.number_field :user_id, :class => "form-control" %>
    <%= f.submit 'Add the node' %>
<% end %>

但是,为了方便起见,我想使用用户的email_address参数而不是他/她的id。我已经在我的控制器中进行了更改以找到链接到电子邮件地址的ID但我的新表单返回错误,这里是:

<%= form_for @node do |f|  %>
    <%= f.text_field :name, :class => "form-control" %>
    <%= f.email_field :user_email_address, :class => "form-control" %>
    <%= f.submit 'Add the node' %>
<% end %>

错误:

undefined method `user_email_address' for #<Node id: nil, name: nil, user_id: nil>

返回的问题很明显,但我不知道如何添加此方法,仍然遵循RoR开发的最佳实践,有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果您有以下行:

<%= f.email_field :user_email_address, :class => "form-control" %>

f对象,它是一个Node对象,它自己调用方法user_email_address。由于没有这样的方法,您将收到错误。

Node模型中添加方法:

def user_email_address
  self.user.email_address
end

添加上述方法后,以下方法将起作用:

<%= f.email_field :user_email_address, :class => "form-control" %>