Как управлять response_to на основе переменной в контроллере Rails? - PullRequest
1 голос
/ 21 марта 2010

Дилемма

Я использую before_filter в моем контроллере, который ограничивает доступ для администраторов. Однако я хочу разрешить публичный доступ к некоторым методам на основе запроса format. См. Метод index, чтобы понять, о чем я говорю.

application_controller.rb

class ApplicationController < ActionController::Base

  # ...

  def current_user
    @current_user ||= User.find_by_id(session[:user])
  end

  def superuser_required
    redirect_to login_path unless current_user.superuser?
  end


end

items_controller.rb

class ItemsController < ApplicationController

  before_filter :superuser_required
  layout 'superuser'

  def index
    @items = Item.all
    respond_to do |format|
      format.html
      format.js # I want public to have access to this
    end
  end

  def show
    @item = Item.find(params[:id])
    respond_to do |format|
      format.html
    end
  end

  def new
    @item = Item.new
    respond_to do |format|
      format.html
    end
  end

  # remaining controller methods
  # ...

end

Ответы [ 2 ]

3 голосов
/ 21 марта 2010

Фильтры имеют доступ к объекту request, который имеет метод format, который можно использовать для получения формата запроса. Измените свой фильтр before, чтобы в случае формата JavaScript обрабатывать запрос было разрешено. Что-то вроде:

def superuser_required
  return true if request.format == Mime::JS
  redirect_to login_path unless current_user.superuser?
end
2 голосов
/ 24 марта 2010

Намного проще, чем я ожидал

2 дня спустя

class FoosController < ActiveRecord::Base

  # use :except to open `show` action for public js access
  before_filter :superuser_required, :except => 'index'

  # before_filter does not apply here
  def index
    @foos = Foo.all

    respond_to do |format|

      # restrict behavior on html access for superusers
      format.html do
        superuser_required  # functions same as before_filter
      end

      # unrestricted on js access for public but only shows foo.id and foo.name
      format.js do
        render :text => @foo.to_json(:only => [:id, :name])
      end

    end
  end

  # restricted to superuser per before_filter
  def new
    @foo = Foo.new
    respond_to do |format|
      format.html
    end
  end

  # restricted to superuser per before_filter
  def show
    @foo = Foo.find(params[:id])
    respond_to do |format|
      format.html
    end
  end

end

Либо я полностью что-то упустил, когда узнал о respond_to, либо мой первоначальный вопрос был совершенно бессвязным. Я только что прочитал это снова, и все равно кажется, что это единственный (и самый) подходящий способ решения моей проблемы.

Удивительно, но я не смог найти в Интернете и примеров такого поведения. Ну что ж. Теперь я знаю больше о respond_to, верно?

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