Rails中表之间的一对一关系

时间:2013-03-05 19:14:01

标签: ruby-on-rails ruby

刚开始我在ROR的第一个项目,我面临着在表之间建立关系的问题。 作为一个菜鸟我在网上搜索了很多,尝试了很多东西,但无法弄清楚如何使这个工作。 这是我的问题:我为登录功能构建了一个用户表 - 用devise制作,现在我想构建另一个表UserMeta来携带我的用户的所有个人资料信息。

以下是我所做的代码:

应用程序/模型/ user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me
  attr_accessible :email, :encrypted_password

  has_one :user_meta
end

*应用/模型/ user_meta.rb *

class UserMeta < ActiveRecord::Base
  attr_accessible :admin, :birthday, :company, :first_name, :job, :last_name, :phone, :rfid, :statut, :website, :user_id

  belongs_to :users
end

class User
  has_one :user_meta
end

*应用程序/控制器/ user_controllers.rb *

  def new
    @user = User.new
    @meta = UserMeta.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

应用程序/视图/用户/ new.html.erb

<%= form_for(@meta) do |f| %>
  <div class="field">
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

它返回:

undefined method `meta_index_path' for #<#<Class:0x000001016f3f18>:0x00000100e9f6f0>

我知道有一个或多个错误,最好的方法是什么?一些帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

  • 在Rails中,最好将您的类命名为与文件名相同。所以app / models / user_meta.rb应为class UserMeta < ActiveRecord::Base

  • 无需在app / models / user_meta.rb中重新打开用户类。他已经了解app / models / user.rb了。

  • 将您的belongs_to :users更改为belongs_to :user

  • 在app / models / user.rb中,您可以删除第二个attr_accessible :email

答案 1 :(得分:1)

你可以改成这样:

应用/模型/ user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :encrypted_password

  has_one :user_meta
  accepts_nested_attributes_for :user_meta
end

应用/模型/ user_meta.rb

class UserMeta < ActiveRecord::Base
  attr_accessible :admin, :birthday, :company, :first_name, :job, :last_name, :phone, :rfid, :statut, :website, :user_id

  belongs_to :user
end

应用/控制器/ user_controllers.rb

def new
  @user = User.new
  @user.build_meta_user

   respond_to do |format|
     format.html
     format.json { render json: @user }
   end
end

应用/视图/用户/ new.html.erb

<%= form_for @user, :url => {:action => 'create'} do |f| %>
  <!-- User related fields -->
  <%= f.fields_for :user_meta do |meta_f| %>
    <div class="field">
      <%= meta_f.label :phone %><br />
      <%= meta_f.text_field :phone %>
    </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>