2016-09-14 29 views
0

私は本当にレールで新しくなっていますので、私はそれを見ることができない場合は私を許してください。#<User :: ActiveRecord_Relation:0x007f1bf8c2fd60>のための未定義メソッド `to_key '

私は、個々のユーザーの権限を編集しようとしていますし、私はのform_forにこのエラーを取得しています:

undefined method `to_key' for #<User::ActiveRecord_Relation:0x007f1bf8c2fd60> 

私はstackoverflowの上の他の質問には何を見ているから、あなたが呼び出すしようとすると、これは通常起こりますフォームのコレクションですが、そうではありませんか?

ビュー:

<div class="n-container"> 
<tr-form data-riot riot-tag="tr-form"> 
<%= form_for(@user) do |f| %> 

    <section> 
     <div class="w-container"> 
      <h1>User permissions</h1> 
      <% @permissions.each do |permission| %> 
       <%= check_box_tag 'permission_ids[]', permission.id %> 
       <div> 
        <%= permission.description %> 
       </div> 
      <% end %> 
     </div> 
    </section> 

    <section> 

     <div class="f-controls align-right"> 
     <%= f.submit class: "btn fill blue", value: "Submit" %> 
     </div> 

    </section> 
<% end %> 
</tr-form> 
</div> 

users_controller:

class UsersController < ApplicationController 
    def user_params 
     params.require('user').permit(
      permissions: [] 
     ) 
    end 

    def permissions 
     @user = User.where(id: params[:user_id]) 
     @permissions = Permission.all 
    end 
end 

路線:

resources :users do 
    get 'permissions' 
    post 'permissions' 
end 

は、事前にありがとうございます!

+3

http://stackoverflow.com/questions/29005090/how-to-solve-undefined-method-to-key-for-bookactiverecord-relation0x007fb?rq=1:plicitlyあなただけのユーザーが必要であることを言います –

+1

あなたの@userは 'User'インスタンスではなく、関係にあるようです。 –

+0

' User.where'はコレクション(= 'ActiveRecord :: Relation')を返します。最初のものを得るために 'first'を呼び出します。代わりに' User.find'を使います。 – nathanvda

答えて

2

一つは、単一のインスタンスを受け取るために、ActiveRecord::FinderMethods#find、ないwhereを使用する必要があります。

def permissions 
    # WRONG: where returns a relation 
    # @user = User.where(id: params[:user_id]) 
    @user = User.find(params[:user_id]) 
    @permissions = Permission.all 
end 

それは言及する価値が、findは、したがって、あなたは、おそらくそれから救出したい、失敗にRecordNotFound例外を発生させていること:

def permissions 
    @user = User.find(params[:user_id]) 
    @permissions = Permission.all 
rescue RecordNotFound => rnf 
    # Log or just skip 
end 

whereはなく、あなたが必要な場合には元に、ここにも[AB]を使用されるかもしれません

@user = User.where(id: params[:user_id]).first 
関連する問題