Rails - проверка в зависимости от того, какой контроллер это - PullRequest
1 голос
/ 30 ноября 2011

У меня есть два контроллера, использующих одну модель. Один из контроллеров должен проверить validate_presence_of: name, а другой - нет. Как настроить проверку так, чтобы она не выдавала ошибку на одном контроллере, который не нуждается в проверке?

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Вы можете создать две модели:

class ModelA < ActiveRecord::Base
end

class ModelB < ModelA
  validates_presence_of :name
end

Затем указать правильные модели в контроллерах.

Или вы можете просто проверить имя в контроллере при создании или обновлении.

class ModelController < ApplicationController
  before_filter :check_name, :only => [:create, :update]
  # ...
  private
    def check_name
      #Handle it how you want, here's an example
      raise Exception if params[:model][:name].nil? || params[:model][:name].blank?
    end
end
1 голос
/ 20 декабря 2011

Другой (извилистый) вариант - использовать условный модификатор при установке проверки:

validates_presence_of :name, :unless => :skip_name_validation?

def skip_name_validation?
  @skip_name_validation
end

def skip_name_validation!
  @skip_name_validation = true
end

def save_without_name_validation
  skip_name_validation!
  save
end

, затем в вашем контроллере:

@object.save_without_name_validation

Я считаю это несколько более явным.Бонусные методы:

def without_name_validation!
  tap {|record| record.skip_name_validation! }
end

# on a relation :
def self.without_name_validation!
  map( &:skip_name_validation! )
end

# in a controller
@object.without_name_validation!.save
@objects.without_name_validation!.each do # something

Однако я признаю, что другое решение более элегантно.

1 голос
/ 30 ноября 2011

Я бы не использовал валидацию, если не применяется всегда .Вы можете просто использовать что-то вроде @model.name.present?, чтобы проверить, присутствует ли имя в контроллере, где вам это нужно.

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