Проблема с использованием метода before_filter и рендеринг частичных - PullRequest
1 голос
/ 23 марта 2011

Я использую Ruby on Rails 3 и пытаюсь понять поведение метода before_filter в контроллере.

В моем контроллере у меня есть

class UsersController < ApplicationController
  before_filter :authorize

  def show
    ...
  end
end

Если янапример, просмотрите страницу http://<my_web_site>/user/1 (которая загружает файл вида users/show.html.erb, заполненный данными от пользователя с идентификатором 1), before_filter также работает.То есть метод authorize делает то, что должен.

Если я отображаю users/show.html.erb файл представления в качестве шаблона для другого контроллера (пример: PostsController) таким образом

# This code is in the `post/show.html.erb` file
<%= render :template => "/users/show", :locals => { :user => @user } %>

before_filter не работает .То есть швы метода authorize не выполняются.

Почему ?!Есть причина для такого поведения, или я где-то ошибаюсь?


ОБНОВЛЕНИЕ (после комментария @brad)

Вырендеринг этого представления как частичный шаблон из контроллера пользователя?Если нет, то before_filter не будет применяться

Если это так, как говорит @brad в своем комментарии, , как я могу заставить before_filter работать с рендерингом этого представления для другого контроллера, чем UsersController?

Ответы [ 4 ]

1 голос
/ 23 марта 2011
  1. Переместить метод авторизации в ApplicationController

  2. Добавить before_filter на каждый контроллер, где вы хотите проверить авторизацию пользователя.

0 голосов
/ 23 марта 2011

Во-первых, вы должны понимать маршрутизацию в Rails.Когда вы набираете в браузере http://<my_web_site>/user/1, он переходит к файлу route, после чего к действию соответствующего контроллера, после того, как этот контроллер запускает представление рендеринга.И у контроллера есть эти обратные вызовы, когда какое-то действие инициируется, тогда эти обратные вызовы должны действовать до или после действия контроллера.Таким образом, в вашем случае вы вызываете частичный шаблон без какого-либо контроллера

0 голосов
/ 23 марта 2011

before_filter применяется к действиям контроллера, а не к действиям.

Таким образом, одно решение состоит в том, чтобы абстрагировать вашу логику авторизации в помощника, который может использоваться при рендеринге вашей частичной функции:

if authorized?
  render :partial => 'users/show'
end

Другое решение - реализовать авторизацию на уровне модели, используя что-то вроде declarative_authorization gem (https://github.com/stffn/declarative_authorization)

0 голосов
/ 23 марта 2011

Когда вы визуализируете шаблон или файл представления / частичное, он на самом деле не обрабатывается как запрос вашего контроллера, поэтому фильтры не применяются.

...