这里有两个问题。首先,我需要在定义所有属性之前访问模型的id。这意味着:
class Search < ActiveRecord::Base
validates_presence_of :name
validates_presence_of :color_data
end
除非我删除第二行,否则会抛出错误,这不是一件好事。我的第二个问题是,我不想渲染json,直到模型具有这两个属性。这是我的控制者:
def create
@search = Search.create( name: (params[:name]) )
Resque.enqueue(InstagramWorker, @search.id)
respond_to do |format|
if @search.save
format.json { render json: @search }
format.html { redirect_to root_path }
else
format.html { redirect_to root_path }
end
end
end
我应该在模型中写一些逻辑来检查名称和&amp;&amp;保存前的color_data?是否有一种解决方法来访问id而不会破坏验证?
答案 0 :(得分:0)
您可能可以使用条件验证,例如
class Search&lt;的ActiveRecord ::基
validates_presence_of :name
validates_presence_of :color_data, if: :some_condition?
private
def some_condition?
# condition logic here
end
端
答案 1 :(得分:0)
你不能这样做。
通过调用Resque.enqueue(InstagramWorker, @search.id)
,你告诉resque做某事,但不是这个请求的一部分。所以现在可以完成,它可以在2小时后完成。
如果您需要确保在请求完成之前完成此操作,请将其从Resque中取出。
您可以做的只是在更新时验证color_data,而不是创建。大概你的重新考试工作叫@search.save
。所以加入
validates :color_data, presence: true, on: :update
但这不会阻止json被渲染,你不能忽略这一事实,即如果不将它从resqueue中取出,这不是请求的一部分。