Rails-макеты, множественные или наследуемые? - PullRequest
1 голос
/ 19 декабря 2011

Я хотел бы знать, как лучше всего это сделать.Я читал Руководства Rails по макетам, но я немного озадачен этим.

У меня есть контроллер пользователей и контроллер сессий.Контроллер пользователей используется для «регистрации», а контроллер сеансов - для «входа».Оба этих контроллера отображают один и тот же макет для входа в систему и регистрации (accounts.html.erb).

После того, как они вошли в систему, я хочу создать другой макет для всего, что происходит при входе в систему (приложение.html.erb).Моя проблема в том, что в контроллере Users у меня есть действие «show», которое представляет собой профиль пользователя, который можно просматривать только тогда, когда пользователь вошел в систему, но это действие «show» использует макет accounts.html.erb из-за«создать» и «новые» действия.Я хочу, чтобы действие 'show' использовало application.html.erb, а остальные действия здесь использовали для account.html.erb.Должен ли я использовать шаблонное наследование для такого рода вещей или как правильно поступить с этим типом вещей?

Возможно, некоторый код также поможет:

class UsersController < ApplicationController  
  layout 'accounts'

 def show
   @user = User.find(params[:id])
   @title = @user.name
 end

 def new
   @user = User.new
   @title = "Sign up"
 end

 def create
   @user = User.new(params[:user])
   if @user.save
     sign_in @user
     flash[:success] = "Welcome"
     redirect_to @user
   else
     @title = "Sign up"
     render :action => "new"
   end
 end

end

1 Ответ

2 голосов
/ 19 декабря 2011

Если действие show является единственным в этом контроллере, которому нужно использовать «application.html.erb», просто отрендерите его с этим макетом в конце действия.

render :layout => "application"

Если вы хотите сделать что-то более надежное, вы можете добавить метод в ваш application_controller.rb, чтобы определить макет на основе того, вошел ли пользователь в систему:

class ApplicationController < ActionController::Base
  ...
  def determine_layout
    if (signed_in) then
      return "application"
    else
      return "accounts"
    end
  end
  ...
end

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @title = @user.name

    render :layout => determine_layout
  end
end

Недостатком этого является то, что вы должны иметь define_layout в конце каждого действия, для которого вы хотите разрешить оба макета. Вы не можете добавить after_filter для определения макета, потому что действие уже будет выполнено к этому моменту.

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