我有两个模型
领导
class Lead < ApplicationRecord
has_many :calls
end
致电
class Call < ApplicationRecord
belongs_to :lead
end
在通话控制器上,我需要更新销售线索
def anything
@call = Call.find(params[:id])
respond_to do |format|
if @call.lead.update(lead_params)
format.html { redirect_to seller_index_path, notice: 'Success' }
format.json { render :index, status: :ok, location: @call.lead }
else
format.html { redirect_to seller_index_path, notice: 'Error' }
format.json { render json: @call.lead.errors, status: :unprocessable_entity }
end
end
end
我可以在Lead模型的after_save中访问特定调用吗?
我需要在调用对象的after_save内部做一些事情
答案 0 :(得分:1)
这个问题不准确。您要更改来自控制器的呼叫(在此示例中为@call
)还是要更改来自该线索的其他呼叫(例如lead.calls.where(...).update_all(...)
)?
我认为,您的意思是第一个问题,为此,我们将进行以下更改:
#in Lead model:
class Lead < ApplicationRecord
attr_accessor :specific_call # call it how it suits your business logic
after_save :do_something_with_specific_call, if: :specific_call # you can use lambda in condition, e.g. if: -> { specific_call.present? }
# your model code
protected # or private
def do_something_with_specific_call
specific_call.update(...)
end
end
#in controller method
def anything
@call = Call.find(params[:id])
@lead = @call.lead
@lead.specific_call = @call # link @call to @lead virtual attribute
respond_to do |format|
if @lead.update(lead_params) # we can now use @lead
format.html { redirect_to seller_index_path, notice: 'Success' }
format.json { render :index, status: :ok, location: @lead } # same here
else
format.html { redirect_to seller_index_path, notice: 'Error' }
format.json { render json: @lead.errors, status: :unprocessable_entity } # same here
end
end
end
我们在这里所做的是创建一个getter和setter方法(attr_accessor
)。如果设置了模型变量(@lead#specific_call
,那么我们将始终运行#do_something_with_specific_call
方法,因此我们在控制器方法中设置此变量。
这也称为模型虚拟属性。