Rails3 - модель разрешений до проверки сохранения? - PullRequest
1 голос
/ 03 ноября 2010

У меня в приложении есть модель разрешений, которая связывает (пользователей, роли, проекты) вместе.

То, что я хочу узнать, как это сделать, - это запретить пользователю удалять себя для своего проекта ...

Можете ли вы дать мне отзыв о следующем?

class Permission < ActiveRecord::Base
.
.
.
  #admin_lock makes sure the user who created the project, is always the admin
  before_save :admin_lock

  def before_save
    #Get the Project Object
    project = Find(self.project_id)
    if project.creator_id == current_user.id
      # SOME HOW ABORT OR SEND BACK Not Allowed?
    else
      #continue, do nothing
    end
  end  

end

Это похоже на правильный подход?

Кроме того, я не уверен, как сделать следующие две вещи выше:

  • Как отменить предотвращение сохранения и отправить сообщение об ошибке msg?
  • Получить в модели устройство current_user.id, которое кажется невозможным, так как же гуру Rails могут делать что-то подобное вышеописанному?

Спасибо, что прочитали

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Как отменить предотвращение сохранения и отправить сообщение об ошибке msg?

return false во время цепочки обратного вызова указывает activemodel прекратить (аналогично тому, как при добавлении ошибок в модель во времявалидация указывает на то, что он должен остановиться в этот момент)

self.errors.add_to_base "msg" добавит в модель ошибку, которая затем может быть отображена в представлении.

Получите в модели устройство, current_user.id, которое кажется невозможным, так как же гуру Rails могут делать что-то подобное, описанное выше?

Модели не должнычтобы действительно знать о таких вещах, как текущий запрос, если это вообще возможно, вы должны блокировать вещи на уровне контроллера / действия.

РЕДАКТИРОВАТЬ:

Итак, роль контроллеров состоит в том, чтобыиметь дело со всем, что связано с получением правильной информации на основе запроса и передачей ее в представление (которое становится ответом).Люди часто говорят «сделайте ваши модели толстыми, а ваши контроллеры худыми», но это можно сказать о любой системе, которая включает объектно-ориентированное проектирование - ваша логика должна быть в объектах, когда это возможно.

При этом, в целомСмысл контроллеров заключается в том, чтобы справиться с маршрутизацией нужных вещей в нужных местах, а аутентификация - определенно проблема маршрутизации.

Вы можете легко переместить строку, сравнивая creator_id с идентификатором пользователя в действии, и реагировать на основеэто.

Теперь, иногда вам действительно нужны эти вещи в модели, и нет никакого способа обойти это.Это становится проблемой, потому что вам нужно бороться с рельсами, чтобы получить его там.Одним из способов было бы attr_accessor поля current_user в вашей модели и передать его при инициализации.Другой способ - удалить поля из хэша params, которые пользователь не может изменять в действии.Хотя это и не так приятно.

1 голос
/ 03 ноября 2010

Договорились с Мэттом, что вы должны попытаться использовать контроллер для перенаправления. Модель должна иметь логику, чтобы определить, подходит ли перенаправление. Может быть, что-то вроде

class ProjectsController < ApplicationController
  def update
    redirect_to(projects_url, :alert => "You can't remove yourself from this project.") and return if Role.unauthorized_action?(:update, params[:project])
    @project = Project.find(params[:id])
    if @project.update_attributes(params[:project])
    ...
  end

class Role
  def self.unauthorized_action?(action, params)
    # your logic here
  end

Вы должны проверить CanCan для некоторых идей.

0 голосов
/ 07 мая 2013
  1. В модели разрешений принять одно поле project_creater как логическое значение
  2. В модели проекта
    before_create :set_project_ownership
      def set_project_ownership
         self.permissions.build(user_id: User.current.id, project_creater: true)
      end
  3. В контроллере проекта
    before_filter :set_current_user
  4. В контроллере приложения
    def set_current_user
      User.current = current_user
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...