Во-первых, я бы не использовал бы 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| %>
Это должно помочь вам получить то, что у вас есть ...