2016-09-14 4 views
0

Ich bin wirklich neu auf Schienen, also bitte vergib mir, wenn ich es nicht sehen kann.undefinierte Methode `to_key 'für # <Benutzer :: ActiveRecord_Relation: 0x007f1bf8c2fd60>

Ich versuche, die Berechtigungen für jeden einzelnen Benutzer zu bearbeiten und ich erhalte diesen Fehler in form_for:

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

Von dem, was ich in anderen Fragen auf Stackoverflow gesehen habe, dies in der Regel passiert, wenn Sie zu anrufen versuchen eine Sammlung in einer Form, aber das ist nicht der Fall?

Ansicht:

<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 

Routen:

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

Vielen Dank im Voraus!

+3

http://stackoverflow.com/questions/29005090/how-to-solve-undefined-method-to-key-for-bookactiverecord-relation0x007fb?rq=1 –

+1

Ihr @user scheint eine Relation zu sein, keine 'User'-Instanz –

+0

'User.where' gibt eine Auflistung zurück (=' ActiveRecord :: Relation'). Rufen Sie 'first' an, um das erste oder ideomatic zu bekommen: benutzen Sie stattdessen' User.find'. – nathanvda

Antwort

2

One ActiveRecord::FinderMethods#find verwenden sollten, nicht where, eine einzelne Instanz zu erhalten:

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

Es lohnt sich zu erwähnen, dass find eine RecordNotFound Ausnahme auslösen auf scheitern, daher werden Sie wahrscheinlich von ihm retten wollen:

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

where sein könnte [ab] auch hier verwendet, aber in einem solchen Fall müssen Sie ex plizit sagen, dass Sie der einzige Benutzer benötigen:

@user = User.where(id: params[:user_id]).first 
Verwandte Themen