在我的Rails应用程序中,我有几个控制器为我的客户构建一个站点。最终用户和管理员几乎使用所有控制器。
我创建了一个包含导航链接的部分内容。我的问题是我不希望它们出现在管理部分内。使这一点变得棘手的部分是,虽然导航应该出现在pages/home
,/galleries
或/galleries/5
之类的内容中,但它们不应出现在/pages/new
或{{1}之类的内容中}。
到目前为止,我一直在为/galleries/5/edit
添加逻辑,但事情已经开始失控,我的if语句中有太多规则,我觉得它很脏。这是一个例子:
片段
application.html.erb
这是我到目前为止所写的全部内容,但如果我继续这样做,它几乎肯定会变得更长。所以这是我的问题:
<% unless current_page?('/') or current_page?('/admin') or current_page?({action: :new}) %>
<%= render "layouts/top_links" %>
<% end %>
是解决这个问题的最好方法吗?答案 0 :(得分:3)
您可以将这些脏逻辑放入帮助程序以使其更清晰
# layouts/application.html.erb
nav_links
# application_helper
def nav_links
return "" if action_name.in?['new', 'edit'] || controller_path == 'admin'
render partial: 'layouts/nav'
end
完成。
答案 1 :(得分:1)
您可以使用基于角色的方法,因为它是最常用的rails中访问控制方法。实际上,application.html.erb
中的所有if-else循环无论如何都会有点代码味道。
为此目的检查Ryan Bates CanCan gem。
答案 2 :(得分:1)
一种可能性是使用您可以在before_filter
中设置的ApplicationController
。你能做什么
应用你自己的味道,但一个愚蠢的例子可能是:
class ApplicationController < ActionController::Base
before_filter :set_navigation_visibility
def set_navigation_visibility
# Your custom logic
end
如果需要,也可以在子控制器中覆盖该方法,或使用:only
和:except
选项修改该方法。
另一种可能性是利用基于角色的访问控制系统。有很多,我用过的这样一个库是Simple-Navigation。 A google search for role-based access control for rails似乎会产生一些可能有用的结果。