我对在rails中进行一对一关联的正确方法有疑问。 我使用Devise GEM作为用户模块,所有用户只能拥有一家公司,所以我做了
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :company
end
和
class Company < ActiveRecord::Base
belongs_to :user
end
创建公司的正确方法是什么?通常我这样做: 如果存在显示消息,如果不继续创建,我检查公司是否存在。那是好方法吗?
def new
if Company.exists?(:user_id => current_user.id )
flash[:notice] = "Only One company is allowed."
redirect_to(:action => 'index')
end
end
def create
# Instantiate a new object using form parameters
@company = Company.new(company_params)
#@company = Company.new(params[:page].merge(:user_id => 1))
# Save the object
if @company.save
# If save succeeds, redirect to the index action
flash[:notice] = "Company created successfully."
redirect_to(:action => 'index')
else
# If save fails, redisplay the form so user can fix problems
render('new')
end
end
答案 0 :(得分:0)
如果您的表单已正确创建,则应该没问题。
在您的用户表单中,您应该使用fields_for,它应该如下所示:
<%= f.fields_for :company do |company_field| %>
<%= company_field.text_field :name %>
<% end %>
修改:不要忘记在模型用户上添加nested attibutes:accepts_nested_attributes_for :address
,位于has_one:company下方。
嵌套属性允许您保存关联记录的属性 通过父母。
除此之外,请注意您希望在new
方法中进行的验证,处理验证的正确方法是使用ActiveRecord Validations。