Rails呈现json验证问题

时间:2015-02-03 16:04:02

标签: ruby-on-rails json

这里有两个问题。首先,我需要在定义所有属性之前访问模型的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而不会破坏验证?

2 个答案:

答案 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中取出,这不是请求的一部分。