2011-04-21 3 views
0

Devise 및 CanCan을 사용하여 사용자 역할을 처리하기 위해 Rails 3 앱을 설정하려고합니다.체크 박스가 다용도 역할을하지는 않지만 퍼팅 중입니다.

class User < ActiveRecord::Base 
    has_many :users_roles 
    has_many :roles, :through => :users_roles 
end 

class Role < ActiveRecord::Base 
    has_many :users_roles 
    has_many :users, :through => :users_roles 
end 

class UsersRole < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

사실 모든 것이 작동 벌금을 다음과 같이

나의 관계이다. Devise가 인증을 완벽하게 처리하고 있습니다. CanCan은 ability.rb를 기반으로 한 사용자 행동을 제한합니다.

하지만 UsersRole을 설정하는 데는 어리석은 문제가 있습니다.

사용자 편집 페이지에서 확인란을 정의했습니다.

<% for role in Role.all %> 
    <%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %> 
    <%=h role.name.camelize %> 
<% end %> 
<%= hidden_field_tag "user[role_ids][]", "" %> 

콘솔을 통해 UserRole을 생성하면이 확인란이 사용자 역할에 따라 선택됩니다.

하지만이 확인란을 사용하여 역할을 설정하거나 변경할 수 없습니다!

HABTM 및 roles_mask 방식으로 전환 된 구문 변형, 내 모델과 컨트롤러를 여러 번 재구성하여 효과가 전혀 없었습니다.

사실은 내 질문의 제목은 완전히 정확하지 않습니다 - 체크 박스는

_method put 
authenticity_token XGl6s1iyXJfahdgftc3df8q1ZeehMVzs3LxiQH98jGw= 
commit Update 
user[current_password] password 
user[email] [email protected] 
user[name] User Name 
user[password] 
user[password_confirmatio...  
user[role_ids][] 1 
user[role_ids][] 4 
user[role_ids][]  
utf8 ✓ 

를 가하고 있습니다하지만이 값은 데이터베이스에 설정되지 않습니다.

내가 뭘 잘못하고 있는거야 ?? ?? 그가 당신의 컨트롤러에 update_attributes 호출과 결합되어있는 경우

답변

2

내 생각 엔 당신이 당신의 사용자 모델과 role_ids이 목록에없는 (그리고 안) 것을 attr_accesible를 지정한 것입니다

다음 role_ids는 없을 것 제대로 설정하십시오.

이 업데이트하거나 저장하기 전에 사건이 다음 수동처럼 컨트롤러에 role_ids을 설정 할 수 있어야합니다 경우 : 물론

@user.role_ids = params[:user][:role_ids] 

, 나는 확실하지 않다 이런 경우 이후입니다 컨트롤러 모델이나 사용자 모델에 대한 자세한 내용은 포함하지 않았습니다.

편집 : 대신 컨트롤러의 @ user.update_attributes을하는 경우

, 당신이이 대신 다음에 변경할 수 있습니다 :

#The same as update_attributes, but without the save 
@user.attributes = params[:user] 

# Here the role_ids get assigned manually so it does not need to be in attr_accesible 
@user.role_ids = params[:user][:role_ids] if params[:user] 

# And here it gets checked if the save was successfull 
if @user.save 
    render :action => :show 
else 
    render :action => :edit 
end 
+0

당신은 절대적으로 정확! 간과하는 것은 항상 작은 것들입니다. role_ids를 attr_accesible로 지정했는데 모든 것이 작동합니다. 이제 컨트롤러를 구현하려고합니다. before_save라고 부르시겠습니까? –

+0

좋습니다. 컨트롤러에서 처리하는 방법에 대한 제안을했습니다. – DanneManne

+0

정확한 코드가 있지만 뷰가 렌더링되지 않고 메시지가 있습니다. FalseClass에 대한 정의되지 않은 메서드 인 'first'. 무슨 문제인지 알려주세요. – amj

관련 문제