呼び出されたパラメーターに応じて表示が異なるフォームがあります。
例.
testsite.local/users/new?type=client
したがって、type
がa
またはb
の場合、フォームには異なるフィールドが表示されます。
私の問題は、フォームが正しく入力されていないことです。ユーザーを正しく保存できなかった場合、フォームがデフォルトのエラーメッセージで表示されますが、パラメーターも表示されません。
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
他のユーザーが私の別の 関連する質問 に回答することで明らかになったように、私が求めていたものは次のとおりです。
form_for @user, :url => { :action => :create, :type => @type }
...パラメータ:type
を新しいレンダリングアクションごとに保持します(コントローラで正しく定義されていると仮定しています)。
それには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%>
どちらもあなたがやりたいことをします。
Railsガイドの抜粋
:actionでrenderを使用することは、Rails初心者にとってしばしば混乱の元になります。指定されたアクションは、レンダリングするビューを決定するために使用されますが、Railsはコントローラーでそのアクションのコードを実行しません
あなたのnew?type=client
は、新しいアクションである種の変数を設定するために使用されていると思いますか?そして、変数は後でnew.html.erbビューで使用されますか?
次に、次のようにcreateアクションを少し変更する必要があります。
else
# add code here to setup any variable for type = client
# and which will be used in your view
render :action => 'new'
end
end
あなたはいつでもそれを強制することができます:
params[:type] ||= "client"
コントローラの新しいアクションで。タイプが設定されていない場合、デフォルトでクライアントになります。ただし、URLには表示されません。