我的控制器中的布局方法不称为rails3

时间:2014-11-01 08:07:42

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我从rails 2升级到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

然后布局完美呈现。

任何人都可以帮我解决这个问题

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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