2015-02-03 4 views
0

Два вопроса здесь. Во-первых, мне нужно получить доступ к идентификатору модели до того, как будут определены все его атрибуты. Это означает, что это:Rails render json validation issue

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 

Должен ли я написать некоторую логику в модели, чтобы проверить имя & & color_data перед сохранением? И есть ли обходной путь для доступа к идентификатору без нарушения валидации?

+0

Вы имеете в виду, например, проверять ': color_data' только иногда? – joseramonc

+0

Проверить наличие color_data только после этого: Resque.enqueue (InstagramWorker, @ search.id), в котором определено color_data. И тогда только render json, если и когда поиск имеет имя AND color_data, но не раньше этого. –

+0

Вы не можете этого сделать. Resque является асинхронным, поэтому не гарантируется завершение до конца цикла запроса. – Yule

ответ

0

Вы, вероятно, можно использовать условные валидации, как

класса Поиск < ActiveRecord :: Base

validates_presence_of :name 
validates_presence_of :color_data, if: :some_condition? 

private 

def some_condition? 
    # condition logic here 
end 

конца

0

Вы не можете это сделать.

Вызывая Resque.enqueue(InstagramWorker, @search.id), вы говорите, что resque что-то делает, но не как часть этого запроса. Таким образом, это может завершиться сейчас, это может завершиться через 2 часа.

Если вам нужно убедиться, что это завершено до завершения запроса, выньте его из Resque.

Что вы можете сделать, это только проверить цветные_данные на обновление, а не создавать. Предположительно, ваши вызовы по вызову resqueue @search.save. Таким образом, путем добавления

validates :color_data, presence: true, on: :update 

Но это не остановить JSON, оказываемые, вы не можете пройти мимо того факта, что это не является частью запроса, не вынимая его из resqueue.