28

呼び出されたパラメーターに応じて表示が異なるフォームがあります。

元。

testsite.local/users/new?type=client

したがって、またはの場合、フォームtypeには異なるフィールドが表示されます。ab

私の問題は、ユーザーが正しく保存されなかった場合、デフォルトのエラーメッセージでフォームをレンダリングするだけでなく、私のパラメーターなしでフォームをレンダリングするため、フォームが正しく入力されていない場合です。

testsite.local/users/new

アクションを呼び出して、renderこのパラメーターに設定されているものを渡すにはどうすればよいですか? フォームを適切に送信できなかった理由と、それが正しいフォームである理由に関する組み込みのエラーメッセージを引き続き保持できるようにするには?

これが私のcreate行動です:

def create
   @user = User.new(params[:user])
   roles = params[:user][:assigned_roles]
   if @user.save
     update_user_roles(@user,roles)
     if current_user.is_admin_or_root?
       flash[:message] = "User \"#{@user.username}\" created."
       redirect_to users_path
     else
       flash[:message] = "Congrats! You're now registered!"
       redirect_to app_path
     end
   else
     render :action => 'new'
   end
 end
4

4 に答える 4

19

私の他の関連する質問に答える別のユーザーによって解明されたように、これが私が求めていたものです:

form_for @user, :url => { :action => :create, :type => @type }

...これ:typeにより、新しいレンダリングアクションごとにパラメーターが保持されます(コントローラーで正しく定義されていると仮定します)。

于 2009-10-12T14:34:35.877 に答える
14

それには2つの方法があります。

非表示フィールドまたは追加のパラメーターを form_for に追加します。

名前付きタイプを含むフォームに非表示フィールドを追加し、それを params[:type] に設定すると、検証が失敗した場合にレンダリング時にタイプが保持されます。

コードを表示:

<% form_for @user do |f| %>
...
<%= hidden_field_tag :type, params[:type] %>
<%end%>

フォームに追加のパラメーターを追加する:

<% form_for @user, create_user_path(@user, :type => params[:type]) %>
...
<%end%>

どちらかがあなたのやりたいことをやってくれます。

于 2009-10-11T04:06:33.343 に答える
6

Rails ガイドの抽出

:action で render を使用することは、Rails の初心者にとってしばしば混乱の原因となります。指定されたアクションはレンダリングするビューを決定するために使用されますが、Rails はコントローラーでそのアクションのコードを実行しません。

new?type=client新しいアクションで何らかの変数を設定するために使用されていると思いますか? そして、変数は後で new.html.erb ビューで使用されますか?

次に、次のように作成アクションを少し変更する必要があります。

  else
     # add code here to setup any variable for type = client
     # and which will be used in your view
     render :action => 'new'
  end
 end
于 2009-10-10T21:24:29.487 に答える
3

次の方法でいつでも強制できます。

params[:type] ||= "client"

コントローラーの新しいアクションで。タイプが設定されていない場合、デフォルトでクライアントになります。ただし、URL にはこれが表示されません。

于 2009-10-10T22:06:15.987 に答える