web-dev-qa-db-ja.com

Rails:render:action?でパラメーターを渡す

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

例.

testsite.local/users/new?type=client

したがって、typeaまたは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
28
neezer

他のユーザーが私の別の 関連する質問 に回答することで明らかになったように、私が求めていたものは次のとおりです。

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

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

19
neezer

それには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%>

どちらもあなたがやりたいことをします。

14
EmFi

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
6

あなたはいつでもそれを強制することができます:

params[:type] ||= "client"

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

3
Ryan Bigg