2014-11-01 4 views
0

Я обновить с рельсов 2 до rails3 и в моем коде контроллера, как этотрасположения в моем контроллере не называется rails3

class UserController < ApplicationController 
    layout :choose_layout 

    def choose_layout 
    return 'login' if action_name == 'login' or action_name == 'set_new_password' 
    return 'forgotpw' if action_name == 'forgot_password' 
    return 'dashboard' if action_name == 'dashboard' 
    'application' 
    end 

    def all 
    @users = User.active.all 
    end 
end 

выше метод компоновки работает отлично на rails2 но не называют в rails3 , Я не знаю, почему это произошло, и если я буду писать код, как это в действии

class UserController < ApplicationController 
    def all 
    @users = User.active.all 
    render :layout => choose_layout 
    end 

    def choose_layout 
    layout_name ="application" 
    layout_name = 'login' if action_name == 'login' or action_name == 'set_new_password' 
    layout_name = 'forgotpw' if action_name == 'forgot_password' 
    layout_name = 'dashboard' if action_name == 'dashboard' 
    layout_name 
    end 
end 

Затем макет делают отлично.

может кто-нибудь помочь мне решить эту проблему

+0

ли вы установить макет в 'ApplicationController'? если да, попробуйте установить его, чтобы проверить, вызвало ли это проблему? – Nimir

+0

привет спасибо за помощь, что он не работает, я пишу его на контроллере app –

+0

Я имел в виду проверить ваш код 'application_controller', имеет ли он по умолчанию макет там' layout: somthing'? check http://apidock.com/rails/ActionController/Layout/ClassMethods/layout последние комментарии упоминает конфликт в этом случае! – Nimir

ответ

0

Я не знаю, почему это произошло, но когда я отладки контроллера и проверить, есть ли какое-либо имя макета, подобное этому

self.action_has_layout? 

, то он будет производить меня nil, поэтому я добавляю фильтр перед контроллером приложения и проверяю, есть ли макет, nil, тогда я устанавливаю макет с помощью метода self.action_has_layout =. , и он отлично работал для меня.

, например, мой код теперь что-то вроде этого

before_filter :set_default_layout 
def set_default_layout 
    unless self.action_has_layout? 
     self.action_has_layout = "application" 
    end 
end 
0

Метод # 1

class UserController < ApplicationController 
    layout :choose_layout 

    def choose_layout 
    case action_name 
    when 'login', 'set_new_password' 
    'login' 
    when 'forgot_password' 
    'forgotpw' 
    when 'dashboard' 
    'dashcboard' 
    else 
    'application' 
    end 
    end 
end 

Способ № 2

class UserController < ApplicationController 
    layout "application" 
    layout "login", only: [:login, :set_new_password] 
    layout "forgotpw", only: [:forgot_password] 
    layout "dashboard", only: [:dashboard] 
end 
+0

я получил эту ошибку ' неопределенный метод 'раскладку» для # ' –

+0

Я протестированы как на рейках 3, так и на самом деле работают. Просто держите приложение «макет» «сверху», если вы идете на метод №2 – mohameddiaa27

+0

Не работает Я также делаю это в контроллере приложений 'include AbstractController :: Layouts :: ClassMethods' Есть ли что-нибудь, что мне не хватает Я использую рельсы 3.2.14 и ruby ​​ruby-1.9.3-p547 –

Смежные вопросы