2012-02-20 9 views
0

私はnameフィールドとその中の様々なClient名前の選択ボックスと非常にシンプルなProjectフォームがあります。空を検証する方法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を選択せず​​に送信したとき、エラーがありますID ""の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です。

答えて

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を救済するか、findを呼び出す前にparams[:project][:client]が空白でないことを確認することでエラーを回避できます。指定されたproject => idでレコードが見つからない場合は、ActiveRecord::RecordNotFoundレコードが見つかりませんというエラーが表示されます。モデルの場合

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

これはRailsのガイドからのものであり、あなたがSelectボックスを検証するために:inclusionを使用することができます。

これは列挙型のフィールドのように機能し、誤った値(つまり、ユーザーがPOSTを偽装した場合)を捕捉します。上記のコード

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

関連する問題