使用has_one关联时保存不起作用

时间:2014-08-22 21:52:20

标签: ruby-on-rails

我有一个正在保存的主要对象。现在我在潜在客户和广告系列之间添加了一个has_one关联。广告系列有一个主角,其中主要广告系列具有外键campaign_id。我的模型中有以下内容:

class Campaign < ActiveRecord::Base
  has_one :lead
end

class Lead < ActiveRecord::Base
  belongs_to :campaign
end

在我的线索控制器中创建动作我有:

def create
    campaign = Campaign.find_by id: params[:campaign_id]
    @lead = campaign.build_lead lead_params

    if @lead.save
      redirect_to lead_path
    else
    end
  end

永远不会保存潜在客户。它不在数据库中。即使if条件通过,它的id值也是nil。我也试过@ lead.save!和@ lead.save(验证:false)。我怎样才能弄清楚错误是什么?

为了实现这一点,我必须删除Lead模型中的belongs_to:campaign。我必须像这样保存它:

campaign = Campaign.find_by_id(params[:campaign_id].to_i)
@lead = Lead.new lead_params

if @lead.save
  @lead.campaign_id = campaign.id
  @lead.save!

2 个答案:

答案 0 :(得分:0)

我认为您需要保存campain,而不是@lead ...

保存campain时,它还会保存其嵌套对象并保持关系。

所以试试吧:

def create
  campaign = Campaign.find_by id: params[:campaign_id]
  @lead = campaign.build_lead lead_params

  if campain.save
    redirect_to lead_path
  else
  end
end

答案 1 :(得分:0)

如果您只是保存一个&#34;普通&#34; Lead,为什么不尝试以下方法:

-

#config/routes.rb
resources :campaigns do
   resources :leads
end

#app/controllers/leads_controller.rb
class LeadsController < ApplicationController
   def new
      @campaign = Campaign.find params[:campaign_id]
      @lead = @campaign.build_lead
   end

   def create
      @campaign = Campaign.find params[:campaign_id]
      @lead = @campaign.lead.new lead_params

      if @lead.save

      end
   end

   private

   def lead_params
      params.require(:lead).permit(:lead, :attributes)
   end
end

#app/models/lead.rb
class Lead < ActiveRecord::Base
   # validations etc
end

#app/views/leads/new.html.erb
<%= form_for @lead do |f| %>
   <%= f.text_field :lead %>
   <%= f.text_field :attributes %>
   <%= f.submit %>
<% end %>

这应该工作如果你将领导作为普通对象传递(IE不是Campaign对象的嵌套属性)。您可能遇到的其他问题将包括您的验证,以防止Lead被保存,或者您的参数未被构建&amp;发送正确

如果上述内容对您不起作用,我建议您上传params行动中收到的new - 如果您收到这些内容,我们就会在一个更强大的位置,以帮助你辨别正在发生的事情。