2

我刚刚进入 Rails,在理解一些我正在阅读的指南似乎认为理所当然的语法元素时遇到了一些麻烦。

今天下午我在做一个小示例项目,并试图重构一些代码。基本上,我想在我的导航栏中包含指向仅管理员控件的链接,这些控件取决于当前正在查看的页面。这是我的原始代码:

class RoomsController < ApplicationController
  before_filter :admin_controlls

  def new
  end

  def create
  end

  def edit
  end

  def update
  end

  def index
  end

  def destroy
  end

  private
    def admin_controlls
      @adminControlls = "rooms"
    end
end

我的想法是,在我想要创建管理控件的每个控制器中,这段代码基本上是相同的。唯一的区别是我想传递给视图的标志变量@adminControlls 的值。

所以,我尝试了这个:

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  def admin_controlls(page)
      @adminControlls = page
  end
end

并将房间控制器更改为:

class RoomsController < ApplicationController
  before_filter admin_controlls "rooms"

  def new
  end

  def create
  end

  def edit
  end

  def update
  end

  def index
  end

  def destroy
  end

end  

我认为我的困惑始于 before_filter 以及为什么在那里调用方法需要一个符号。我不知道如何在将字符串作为符号调用时将其传递给方法,并且我所有将 before 过滤器更改为调用方法(如上)的努力都失败了。总的来说,我只是觉得我没有掌握语法的一些微妙之处。如果有人有有用的资源,我将不胜感激。

4

2 回答 2

1

你可以试试这个:before_filter { |c| c.admin_controlls "rooms" }?可以在此处找到类似的问题:如何将参数发送到前置过滤器?

于 2012-09-19T01:27:27.763 回答
0

它需要一个符号的原因是对“before_filter”的调用在第一次加载控制器类时运行......但是您希望在每个单独的操作(不仅仅是一次)上调用实际的 before_filter方法(admin_controlls) .

因此,加载时 before_filter 调用存储了稍后调用的方法的名称......每次运行控制器操作时。

于 2012-09-19T09:57:50.247 回答