Rails Association未分配密钥

时间:2016-02-12 07:56:11

标签: ruby-on-rails ruby ruby-on-rails-4

真实故事:我有模特用户,个人资料和雇用。

用户有一个个人资料。用户可以雇用任何用户来完成这项工作,以便我可以实现User.first.hires

#user.rb
has_one :profile
has_many :hires
before_create :build_profile

我需要知道用户雇用了谁,所以我设置了一个外键(profile_id),因为(user_id)是当前用户。 Hire模型看起来像这样,减去时间戳:

#Hire Model
:id => integer, 
:user_:id => integer, #foreign key for user
:foo => :string,
:profile_id => :integer #foreign key for profile

现在列出所有" John"雇用:

h = User.first.hires
h.map do |p| p.profile_id end

我的问题是,profile_id未被分配,如果由于路线或关联而导致我丢失。我可以在rails_admin中分配没有问题。

#profile.rb
belongs_to :user
has_many :hires

hire.rb:

belongs_to :user
belongs_to :profile

我为公司views/company/show.html.erb创建了一个展示页面。该页面有一个雇用流程的模式。该模态来自渲染:views/hires/_form.html.erb。并以这种形式:

<%= form_for @hire, url: user_accounts_hires_path(current_user), :html => { :data => {:abide => ''}, :multipart => true } do |f| %>
  <h1>Hire Form</h1>
  <!--text fields and submit button-->
<% end %>

hires_controller.rb:

def new
  @hire = Hire.new
end

def show
  @hire = Hire.find( params[:id] )
end

def create
 employer = User.find( params[:user_id] )
 @hire = employer.hires.build(hire_params)

 if @hire.save
   #flash yes, no etc
 end
end

private
  def hire_params
    params.require(:hire).permit(:a, :b, :c)
  end

回顾:

我在公司页面上。按下按钮进行模态,填写表格,点击提交,一切都很顺利,但未分配profile_id。只有user_id。还有什么你需要看的吗?

回答aliibrahim:

更新创建方法:

...
employer = current_user
contractor_id = User.find( params[:user_id] ).profile.id

@hire = employer.hires.build(hire_params.merge({"profile_id" => contractor_id}))
...

对于表单(用params [:id]替换current_user):

<%= form_for @hire, url: user_accounts_hires_path(params[:id]), :html => { :data => {:abide => ''}, :multipart => true } do |f| %>

1 个答案:

答案 0 :(得分:0)

您需要更新控制器中的def create

def create
   employer = current_user
   contractor_id = User.find( params[:user_id] ).profile.id
   @hire = employer.hires.build(hire_params.merge({"profile_id" => contractor_id})    
 if @hire.save
   #flash yes, no etc
 end
end

您的hire_params方法也应该permit profile_id