2009-12-16 43 views
0

我想创建一堆的动态辅助方法,像这样的动态辅助方法:创造轨

show_admin_sidebar 
show_posts_sidebar 
show_users_sidebar 

到目前为止,我有这在我的helper.rb文件:

#spits out a partial 
def show_sidebar(name, show_sidebar = true) 
    @content_for_sidebar = render :partial => "partials/#{name}"      
    @show_sidebar = show_sidebar 
end 

def show_sidebar? 
    @show_sidebar 
end 

在我的应用程序布局文件我有这样的:(NB - 我使用HAML):

- if show_sidebar? 
    = yield(:sidebar) 

这让我说我的VI以下ews:

- show_sidebar(:foo) 
- show_sidebar(:bar) 

并且这呈现所需的部分。

问题在于,我只能每页添加一个边栏。所以,我想我需要有像show_admin_sidebar,show_foo_sidebar这样的动态方法。

所以我试图做到这一点:

def show_#{name}_sidebar(show_sidebar = true) 
@name = name 
@content_for_#{@name}_sidebar = render :partial => "partials/#{@name}"      
    @show_sidebar = show_sidebar 
end 

,然后在我的布局:

- if show_sidebar? 
    = yield("{@name}_sidebar") 

但Rails不喜欢这样的。

我已经尝试了几乎所有我能想到的在我的帮助文件中,并没有任何工作。

我使用帮助器方法的原因是因为我希望我的内容div是100%的页面宽度,除非存在侧边栏,在这种情况下主要内容会进入较小的div,并且侧边栏内容会进入它自己..

如果我不能得到这个工作的话,我可以很容易地通过只是手动添加谐音解决这个问题,但我想我的头圆这个....

任何人有这种事情的任何经验?

回答

2

这里是你的解决方案,但是我不建议过多的元编程:

#Add the following snippet to the proper helper module: 
['admin','user','whatever'].each do |name| 
    class_eval{ 
    "def show_#{name}_sidebar(show_sidebar = true) 
     @name = #{name} 
     @content_for_#{@name}_sidebar = render :partial => 'partials/#{@name}'      
     @show_sidebar = show_sidebar 
    end" 
    } 
end 
+0

THaNKYOU这么多。这对我来说是新的一步,所以这是一个非常大的帮助。我想我可以从这里找到我的路。 regds steve – stephenmurdoch 2009-12-16 22:28:19

0

高清显示_#{name}的_sidebar(show_sidebar =真)

这并不像有效的Ruby给我。你是自己解析和评估它,还是只是将它放在文件中并期望它能正常工作?

+1

感谢您的回复, 是的,我只是有点希望它会工作。不确定解析和评估是诚实的。我喜欢与动态find_by方法类似的somethign。我试图找出他们如何工作,然后可能重用该技术。将按照您的建议研究解析和评估。 – stephenmurdoch 2009-12-16 22:03:34

+0

那么你唯一真正的问题是你没有真正学习Ruby。 http://ruby-doc.org/core/classes/Kernel.html#M005925 – 2009-12-16 22:10:05

+0

哈哈!真正。感谢您的链接。每个人都需要从某个地方开始。 – stephenmurdoch 2009-12-16 22:32:26

4

这个整个做法是奇怪的过于复杂,没有按照Rails的惯例,也不要做出丝毫的有点意义,并且对先前的受访者感到羞耻,因为这种方法不能帮助他简化。迟到了13个月,我对此表示歉意。

您的控制器应该决定是否显示侧栏,并将实例变量@side_bar_name设置为nil或侧栏名称字符串。然后在共享视图代码的某处,可能是views/layouts/application.html。ERB,你会因为这简单的东西:

<% if @side_bar_name %> 
<%= render :partial => "partials/#{@side_bar_name}" %> 
<% end %> 

或者更好的是:

<%= render(:partial => "partials/#{@side_bar_name}") if @side_bar_name %> 

如果你想使用一个辅助(这是不是让你的代码DRY和读取的坏主意)它将基本上是相同的代码,只是进入助手。

<%= side_bar_helper %> 

def side_bar_helper 
    render(:partial => "partials/#{@side_bar_name}") if @side_bar_name 
end 

控制器的功能取决于您。它可能会做这样的事情:

if session[:show_side_bar] 
    # maybe use cookies instead of session, or store user preference in a database 
    @side_bar_name = session[:side_bar_name] 
end