2011-10-21 9 views
2

これで実現したい機能は、ユーザーが現在行っている操作に基づいて異なるフィールドを持つことです。フィールドを条件付きでレールから除外するフォーム

一般的な足場は、部分的にフォームをバンドルし、新しい編集アクションでそれをレンダリングします。一般的なサインアップの場合、プロファイルが更新されるたびにパスワードを更新したくない場合があります。私が過去にこれを解決するために使用した方法の1つは、の新しいフォームを作成することです。です。新しいパスワードだけが含まれています。明らかに、ほとんどのフィールドはそれ自身を繰り返す。部分的なままにする方法がありますが、アクションごとにフォーム上のいくつかのフィールドを省略します(これにより更新されません)。手動でフィールドとして表示aretフィールドに書き込むために

<% if params[:action] == "new" %> 
    <%= f.field_type :field_name %> 
<% end %> 

しかしこのdoesntのは、POSTフィールドを追加することから、攻撃者を遠ざけるために、あなたは、セキュリティについて考える必要があります。

答えて

6

は、私はあなたがいると仮定しましょうかコントローラには、ユーザmodel.Soためのフォームを作成、フォーム部分の使用で

def new 
    @user = User.new 
    ..... 
end 

def edit 
    @user = User.find(params[:id]) 
    .... 
end 

<% if @user.new_record? %> 
<%= f.field_type :field_name %> 
<% end %> 
0123を持っています

これは、編集/更新中にフィールドを表示しません。

+0

すべてのメソッドが望ましい結果を返しますが、余分な変数が追加されず、ビューにparamsハッシュが公開されないため、これが好きです。 – iGbanam

0

あなたは1部分でこのようにそれを試すことができます形!

+0

リクエストを投稿するときにフォームに含まれていないフィールドのパラメータは、Railsには含まれません。それほど確かではありませんが、私はこれがCSRFのためのものだと思います。ヘッドアップありがとう – iGbanam

0

ビューに渡されているアクティブなレコードオブジェクト(@userなど)が新しいレコードであるか、 'new_record'メソッドを使用する古いレコードオブジェクトであるかを確認できます。これに基づいて、表示する項目を決定することができます。 また、部分的な値を渡して、ある値(おそらくブール値)を渡し、その値に基づいてレンダリングするフィールドを決定することもできます。 これは以下のように行われてすることができます、部分的=> 'partial_name': レンダリング地元の人々=> {:BOOL =>真}

してから部分的に

<% if bool == true %> 
<%= f.xyz_tag :name %> //whatever field you want 
<% end %> 
+0

どのようにboolの代わりにフォームモデルフィールドのいくつかを渡すことができますか?さらに具体的には、fields_forと(accept_nested_attributes_forを使用して)レンダリングされる、コレクション内の多くのオブジェクトの1つのフィールドをどのように渡すのですか? –

関連する問題