2012-09-19 84 views
2

我刚刚进入Rails,并且我在理解某些语法元素时遇到了一些麻烦,我正在阅读的这些指南似乎理所当然。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 

我的想法是,这个代码本质上是相同的每个控制器,我想创建管理控制。唯一的区别是我想传递给View的标志变量@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,来开始,为什么叫有一个方法需要一个符号。我不知道如何将字符串作为符号调用时将字符串传递给方法,并且我所有改变之前的过滤器以调用方法(如上所述)的努力都失败了。总的来说,我只是不觉得我正在掌握语法的一些微妙之处。如果任何人有一个会有所帮助的资源,我会很感激。

+0

你看过'params [:controller]'吗? –

回答

1

你可以试试这个:before_filter { |c| c.admin_controlls "rooms" }?类似的问题可以在这里找到:How can I send a parameter to a before filter?

+0

这确实有用。同样简单的before_filter {admin_controlls“rooms”}或before_filter做admin_controlls“房间”结束 如果有人能解释为什么这个块语法是必要的,我一定会喜欢。我真的很难理解语法。我觉得我更像记住一个“做这个,不是那个”的列表,而是理解为什么需要某些东西。 –

+0

你会习惯它的。它是学习新语言/框架的重要组成部分。它有助于查看源代码:https://github.com/rails/rails/blob/master/actionpack/lib/abstract_controller/callbacks.rb。你会发现它需要一个块作为第二个参数。该文档可能会提供更好的洞察力:http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-_insert_callbacks –

0

为什么它需要一个符号的原因是要“的before_filter”第一次加载控制器类时被运行的呼叫......但你要实际的before_filter 方法( admin_controlls)在每一个动作(不只是一次)上被调用。

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