Как проверить правильность выбора пустого поля с помощью Ruby on Rails? - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть очень простая форма Project с полем name и полем выбора с различными именами Client:

<%= f.label :name %><br/>
<%= f.text_field :name %>

<%= f.label :client_id %><br/>
<% options = current_user.clients.all.map { |client| [client.name, client.id] } %>
<%= f.select(:client_id, options, {:prompt => 'Select...'}) %>

Теперь, когда пользователь нажимает кнопку "Отправить", фактически не выбравClient из поля выбора возвращается сообщение о том, что Client с идентификатором "" не может быть найдено.

Есть ли способ изменить код моего контроллера, чтобы он работал?

def create
  client = current_user.clients.find(params[:project][:client_id])
  @project = client.projects.build(params[:project])
  if @project.save
    flash[:success] = "Project created."
    redirect_to @project
  else
    render :action => "new"
  end
end

Локальная переменная client вызывает проблему, но я не знаю, как ее исправить, чтобы ошибки обрабатывались методами валидации.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Для вашего контроллера вы можете избежать ошибки, спасая nil или проверив, что params[:project][:client] не пусто перед вызовом find.Обратите внимание, что если запись не найдена с данным проектом => id, она все равно выдаст вам ошибку ActiveRecord::RecordNotFound запись не найдена.

Для модели

class Coffee < ActiveRecord::Base
  validates :size, :inclusion => { :in => %w(small medium large),
    :message => "%{value} is not a valid size" }
end

Этовзято из руководства по Rails, и вы можете использовать :inclusion для проверки поля Select.

Он также будет перехватывать ошибочные значения (т. е. если пользователь подделывает POST), действуя как поле перечисления.

http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion

1 голос
/ 20 февраля 2012

Выше кода пытается получить client object by passing id as nil. Следующий код должен работать при условии validation for client record перед сохранением записи проекта.

def create
  client = current_user.clients.find(params[:project][:client_id]) rescue nil
  unless client
    @project = Project.new(params[:project]) # Required for making the form fields pre-populated
    @project.valid? # this line will populate the error messages
    render :action => "new"
    return
  end

  @project = client.projects.build(params[:project])
  if @project.save
    flash[:success] = "Project created."
    redirect_to @project
  else
    render :action => "new"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...