Rails: отображение разных представлений для одного и того же URL? - PullRequest
4 голосов
/ 22 октября 2010

Во-первых, пример того, что я пытаюсь сделать:

  1. Если вы перейдете на http://www.meetup.com и не выполнили вход, вы увидите страницу с надписью «Сделать».что-то • Узнайте что-нибудь ... »и т. д., которая является общедоступной страницей
  2. Но когда вы вошли в систему, на этой же странице (URL) отображается« Добро пожаловать, ххх ... что происходит ... »и т. д.что специфично для вас.
    Это то, что я пытаюсь сделать и в своем приложении.

Как это сделать в Rails 2.3.8?

Пока у меня есть:

  1. AboutsController, предназначенный для отображения полустатических страниц (желательно, чтобы About не был множественным числом!)
  2. Корневой маршрут - map.root => :controller => "about".

Теперь, когда не зарегистрированный пользователь переходит к http://www.abc.com, он получает содержимое представления about/index.Пока все хорошо.

Но, когда пользователь вошел в систему , я хочу, чтобы представление products/index отображалось для того же URL, то есть URL http://www.example.com (а не http://www.example.com/products)

Возможно ли это в Rails 2.3.8?

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

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

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

class CommentsController < ApplicationController
  before_filter :user_logged_in?, :only => [:edit, :update, :destroy]

  # all your actions would go here - index, show, etc #

  protected

  def user_logged_in?
    redirect_to dashboard_path unless current_user
  end
end

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

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

Это де-факто способ справиться с чем-то подобным. Очень хороший вопрос.

2 голосов
/ 22 октября 2010

Это, конечно, возможно. Вы можете сделать любой вид, который вам нужен, условно, как это:

 def index
   if current_user
     render :action => 'products', :controller => 'index'
   else
     render :action => 'index', :controller => 'about'
   end
 end

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

1 голос
/ 22 октября 2010

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

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