Флажки получают, но не ставят роли многие ко многим - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь настроить приложение Rails 3 для обработки пользовательских ролей с помощью Devise и CanCan.

Мои отношения таковы

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 ограничивает поведение пользователя в зависимости от способности.

Но у меня нелепая проблема с настройкой UserRole.

Я установил флажки на странице редактирования пользователя следующим образом.

<% 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 и role_mask, несколько раз перестраивал мои модели и контроллеры - все безрезультатно.

На самом деле название моего вопроса не совсем корректно - флажки ставят

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

Но эти значения не устанавливаются в базе данных.

Что я делаю не так ?? !!!

1 Ответ

2 голосов
/ 21 апреля 2011

Я предполагаю, что вы указали attr_accesible в вашей модели User и что role_ids там не указан (и не должно быть)

Если в сочетании с вызовом update_attributes в вашем контроллере, то role_ids никогда не будетбыть установлен правильно.

Если это так, то вы должны вручную установить role_ids в вашем контроллере, как это, прежде чем обновлять или сохранять:

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

Конечно, я 'Я не уверен, что это так, поскольку вы не включили свой код контроллера или какие-либо подробности в модель User.

Edit:

Вместо этого, если вы выполняете @ 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
...