77

マイ アカウントのインデックス ページにはすべてのアカウントが一覧表示され、アカウントごとに「+ サービス」へのリンクがあります。これにより、ユーザーは /my_services/new ページに移動し、アカウント インデックス ページでクリックされたリンクに応じて、account_id フィールドに適切な ID が事前入力されます。

すべてのページの下部に debug(params) がありますが、私が試していることでは、/my_services/new ページのパラメーターに :controller と :action が表示される以外は何も得られません。

私が試してきたリンクはこれです:

link_to "+ Service", "my_services/new", :account_id => acct.id

次に、サービス コントローラーにもロジックがあります。

def new
  @my_service = MyService.new
  if params[:account_id]
    @my_service.account_id = params[:account_id]
  end
end

誰かがこれを行う適切な方法を手伝ってもらえますか? 私が試したいくつかの厄介で小さなハッキーなものでは、まだそれを実現できていません。

編集

誰かが将来この回答を見ている場合、ネストされたリソース (おそらくshallow: trueroutes.rbのオプションを使用) が適しているようです。この部分の routes.rb は次のようになります。

resources :accounts, shallow: true do
  resources :services
end

私のリンクは次のようになります。

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
4

3 に答える 3

119

まず、link_toはhtmlタグヘルパーであり、2番目の引数はurlであり、その後にhtml_optionsが続きます。必要なのは、account_idをurlパラメーターとしてパスに渡すことです。ルート.rbで名前付きルートを正しく設定している場合は、パスヘルパーを使用できます。

link_to "+ Service", new_my_service_path(:account_id => acct.id)

ベストプラクティスは、モデル値を:内にネストされたパラメータとして渡すことだと思います。

link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id })

# my_services_controller.rb
def new
  @my_service = MyService.new(params[:my_service])
end

また、account_idが「一括割り当て」に許可されるように制御する必要があります。Rails 3では、強力なコントロールを使用して、それが属するコントローラー内の有効なパラメーターをフィルターに掛けることができます。私は強くお勧めします。

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

また、account_idがユーザーによって自由に設定されない場合(たとえば、ユーザーが自分の単一のaccount_idに対してのみサービスを送信できる場合は、リクエストを介して送信するのではなく、何かを追加してコントローラー内で設定することをお勧めします。お気に入り:

@my_service.account_id = current_user.account_id 

You can surely combine the two if you only allow users to create service on their own account, but allow admin to create anyone's by using roles in attr_accessible.

hope this helps

于 2012-05-27T12:06:57.603 に答える
10

これを試して

link_to "+ Service", my_services_new_path(:account_id => acct.id)

必要に応じて account_id を渡します。

link_to の詳細については、このhttp://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_toを使用してください

于 2012-05-27T11:54:50.963 に答える