две формы одна модель в Ruby, отдельные проверки для каждого - PullRequest
1 голос
/ 30 января 2012

У меня есть три поля в одной форме и два поля в другой (так же, как в предыдущей форме, но только одно поле отсутствует).Я хочу проверить только два поля в меньшей форме, но проблема в том, что он проверяет все три.

Я написал следующую логику:

**

class User < ActiveRecord::Base
  validate :validate_form #for form with 2 fields
  private
    def validate_form
      if :classify_create
        self.errors.add(:weight, "need weight") if weight.blank?
        self.errors.add(:height, "need height") if height.blank?
      end
  end

  #   Validations of attributes (for form with three fields)
  validates :weight, :presence => true

  validates :height, :presence => true

  validates :gender, :presence => true
end

**

и это мое действие контроллера: в основном я написал два отдельных создания:

**# for form with two fields
  def classify
    @user  = User.new
    @title = "Classify"
  end

  def classify_create
    @user  = User.where("weight = ? and height = ?", params[:weight] ,params[:height])
  end

# for form with three fields
  def new
    @user  = User.new
    @title = "Train"
  end

  def create
    @user = User.new(params[:user])
    if @user.save
       redirect_to @user
    else
      @title = "Train"
      render 'new'
    end
  end**

Когда я отправляю форму в два поля, она выдает мне ошибкудля пола тоже и перенаправляет на страницу с формой, имеющей три поля.Как мне поступить?

Любая помощь будет оценена.

С уважением, Арун

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Во-первых, я бы не использовал бы classify в качестве имени метода.Вы можете конфликтовать с основным инфлектором , предоставленным ActiveSupport.Назовите это classification или как-то.

Во-вторых, ваша проверка выполняется на if @user.save в методе create.

В classify_create вы используете User.where(...), который является методом поиска.Вы тянете подходящую запись и устанавливаете ее на @user.Это не запускает проверку, но вы получаете ошибки проверки.Вы публикуете на create, а не classify_create.Это приведет к неправильным маршрутам.

Давайте сначала обратимся к условной проверке.В вашей модели User создайте переменную, которая будет действовать как обходной переключатель для вашей гендерной проверки.Затем перед проверкой передайте подтверждение, чтобы проверить, не является ли этот обходной переключатель ложным:

User < ActiveRecord::Base
  attr_accessor :skip_gender  # defaults to nil (false)
  # ...

  validates :gender, :presence => true, :if => :validate_gender? # validate if...
  # ...

  private
  def validate_gender?
    !self.skip_gender # true = run validation, false = skip validation
  end
  # ...
end

Затем очистите контроллер.Напишите два create метода, один - для установки переключателя, другой - нет.(Это не СУХОЙ):

def new_classification
  # for form with two fields
  @user  = User.new
  @title = "Classify"
end

def new
  # for form with three fields
  @user  = User.new
  @title = "Train"
end

def create
  @user = User.new(params[:user])
  if @user.save
    redirect_to @user
  else
    render :action => 'new' # render three-field form
  end
end

def create_classification
  @user  = User.where(:weight => params[:weight], :height => params[:height])
  # ... do something with @user ...
  @user.skip_gender = true # tell @user to skip gender validation
  if @user.save
    redirect_to @user
  else
    render :action => 'new_classification' # render two-field form
  end      
end

Далее, настройте config/routes.rb, чтобы указать маршруты к вашим пользовательским методам.

resources :users do
  member do
    get 'new_classification',     :to => 'users#new_classification', \
                                  :as => :new_classification_for
    post 'create_classification', :to => 'users#create_classification', \
                                  :as => :create_classification_for
  end
end

Теперь измените представление формы с двумя полями.Укажите, куда отправляется ваша форма.

<%= form_for @user, :url => create_classification_for_user_url(@user) do |f| %>

Это должно помочь вам получить то, что у вас есть ...

0 голосов
/ 30 января 2012

Ваша проблема двоякая:

  1. Вы пытаетесь использовать один контроллер для двух разных действий.
  2. Модель проверки Rails несколько ограничена и негибкая, поэтому следуетбыть отдельными проходами проверки для методов и моделей контроллера.

Простое решение состоит в том, чтобы обойти ограничения с помощью отдельного контроллера:

def create_genderless
    # Force the issue to an explicit "unknown" state so that
    # "unknown" and "missing" can be differentiated.
    params[:user][:gender] = 'U'
    # And then punt to the existing `create` method.
    create
end

Тогда немного больше проверки в вашей моделидля правильной меры

class User < ActiveRecord::Base
    validates :gender, :inclusion => { :in => %w[M F U] }
    #...
end

Затем обновите свои формы, чтобы использовать UserController#create или UserController#create_genderless в зависимости от ситуации.

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