繁体   English   中英

在Rails中创建动态助手方法

[英]creating dynamic helper methods in rails

我正在尝试创建一堆像这样的动态助手方法:

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

在我的应用程序布局文件中,我有以下内容:(注意-我正在使用HAML):

- if show_sidebar?
  = yield(:sidebar)

这使我可以发表以下看法:

- 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,侧边栏内容将进入其自身。

如果无法正常工作,则可以通过手动添加局部零件轻松解决此问题,但是我想解决这个问题。

任何人都对这种事情有经验吗?

整个方法极其复杂,根本没有遵循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

这是为您提供的解决方案,但是我不建议过多的元编程:

#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

def show _#{name} _sidebar(show_sidebar = true)

在我看来,这不是有效的Ruby。 您是自己解析和逃避此问题,还是只是将其扔到文件中并期望它能正常工作?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM