Ruby on Rails: одна и та же проверка в нескольких действиях в контроллере - PullRequest
2 голосов
/ 17 января 2012

Сначала мои извинения, если это повторяющийся вопрос.Я пытался найти ответ, но так как я очень новичок в Rails, я не знал, что искать.

У меня есть контроллер, который имеет некоторую безопасность на нем.Для показа, редактирования, обновления и уничтожения действий мне нужно проверить, владеет ли пользователь персоной, над которой он работает, например:

if @persona.user_id != @current_user.id

  flash[:notice] = "Sorry, we couldn't find that persona"
  redirect_to '/personas/'

else

  # do something else

Это относительно просто.Тем не менее, как мне сделать это сухим способом?Код перед else повторяется во всех 4 действиях, код после оператора else будет отличаться для каждого контроллера.

Заранее спасибо.

Ричард

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Вам нужно будет использовать before_filter. Как то так:

class PersonasController < ApplicationController
  before_filter :check_owner, :only => [:show, :edit, :update, :destroy]

  def show
  #...
  end

  #...etc.

  protected

  def check_owner
    redirect_to personas_path unless params[:id] == current_user.id
  end
end

Кроме того, примите совет @ davidb по написанию метода current_user, если у вас его еще нет, который будет указан в вашем application_controller.rb. Как то так:

class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : User.new
  end
end

Возможно, вам придется все это настроить, так как это будет зависеть от того, как настроены ваши модели. Это всего лишь общее представление о том, что вам нужно / нужно делать.

1 голос
/ 17 января 2012

Использование before_filter Вот обзор:

http://guides.rubyonrails.org/action_controller_overview.html#filters

Чтобы высушить его, вы также должны написать current_user метод, который возвращает зарегистрированного пользователя!

0 голосов
/ 17 января 2012

Вы можете переместить свою логику безопасности в before_filter. Он запустится до ваших действий и проверит вашу безопасность.

Ваш файл контроллера:

class TestController

   before_filter :check_persona, :only => [:show, :edit, :update, :destroy]

   private

      def check_persona
         if @persona.user_id != @current_user.id
            flash[:notice] = "Sorry, we couldn't find that persona"
            redirect_to '/personas/'
         end
      end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...