4

時々、カスタマイズされた登録リンクをリードに送信します。リンクには、登録フォームへの事前入力に使用できるパラメーターが含まれています。

http://www.example.com/users/sign_up?user[company_name]=Foo&user[region]=NA

登録フォームには、会社名と地域を受け入れるためのフィールドがあります。これは、登録リンクに基づいて事前に入力できます。

registrations#newこれは実際には機能するはずですが、アクションの実装方法によるものではありません。新しいアクションは build_resource、空のハッシュを使用してメソッドを呼び出します。

def new
  resource = build_resource({})
  respond_with resource
end

build_resourceメソッドはresource_params、入力がnil以外の場合を無視します。

def build_resource(hash=nil)
  hash ||= resource_params || {}
  self.resource = resource_class.new_with_session(hash, session)
end  

この問題を解決するには、登録コントローラーのnewアクションをオーバーライドする必要がありました。私の解決策はもろいので好きではありません。

def new
  resource = build_resource
  respond_with resource
end

newアクションが空のハッシュで呼び出される理由はありますか?create(アクションのように)空のハッシュなしで呼び出すことはできますか?

4

2 に答える 2

1

私は結局、アクションbuild_resourceへの変更をオーバーライドして範囲を限定しました。new

def build_resource(hash=nil)
  # scope the change to new actions 
  return super unless action_name == "new"
  super.tap do |user|
    user.company_name = params[:user][:company_name]
    user.reg‭ion = params[:user][:reg‭ion]      
  end
end
于 2015-06-12T21:34:55.597 に答える
0

これがbuild_resourceメソッドの意図された動作であると思います。同様にModel.new、初期化プロパティのハッシュを渡すことも、何も渡さないこともできます。その結果、それぞれ事前に入力されたモデルと空のモデルになります。

コントローラのアクションをより明確にしたい場合は、代わりに呼び出すことができますbuild_resource(params[:user])。これにより、懸念される脆弱性を回避できます。

于 2013-10-26T11:06:11.663 に答える