2012-02-20 4 views
0

У меня есть очень простая Project формы с name полем и выберите поле с различными Client именами в нем:Как проверить пустое поле с помощью Ruby on Rails?

<%= 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 с ID "" не найден.

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

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 переменная, которая вызывает проблемы, но я не знаю, как это исправить, так что ошибки будут обработаны с помощью методов проверки.

ответ

1

Приведенный выше код пытается принести 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 
+0

Большое спасибо за помощь! – Tintin81

2

Для вашего контроллера вы можете избежать ошибки путем спасения 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 

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

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

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

Смежные вопросы