условная валидация в одной модели, но в двух разных формах - PullRequest
1 голос
/ 14 ноября 2011

У меня есть одна модель, но две разные формы, одну форму я сохраняю с помощью действия create, а другую с помощью действия student_create. Я хочу проверить поле в форме действия student_create и оставить другую свободную. сделать это? Любая помощь будет оценена

 class BookController < ApplicationController
     def create
      if @book.save
     redirect_to @book    #eliminated some of the code for simplicity
      end 
     end

     def student_create
     if @book.save            #eliminated some of the code for simplicity
      redirect_to @book
     end
     end

Я пробовал это, но это не сработало

      class Book < ActiveRecord::Base
        validates_presence_of :town ,:if=>:student?

    def student?
    :action=="student_create"
    end
    end

Также это не сработало

      class Book < ActiveRecord::Base
        validates_presence_of :town ,:on=>:student_create
       end

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

В том, который не должен быть проверен, вы делаете это:

@object = Model.new(params[:xyz])

respond_to do |format|
     if @object.save(:validate => false)
          #do stuff here
     else
          #do stuff here
     end
end

save(:validate => false) пропустит проверку.

0 голосов
/ 14 ноября 2011

Похоже, у вас есть два типа книг. не уверен, что логика вашего домена, но нормальный поток я бы ничего не делал.

class Book < ActiveRecord::Base

end

Тогда для пути, который вы хотите дополнительной проверки, вы можете сделать это:

class SpecialBook < Book
  validates :town, :presence => true
end

Если это так, вы можете рассмотреть возможность наследования одной таблицы.


В другом случае вам может понадобиться сохранить student_id в книге.

Тогда

class Book < ActiveRecord::Base
  validate :validate_town

  private
    def validate_town
      if student_id
        self.errors.add(:town, "This book is evil, it needs a town.") if town.blank?
      end
    end
end
0 голосов
/ 14 ноября 2011

Мне удалось сделать то, что я хотел сделать, дав ему опцию :allow_nil=>true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...