2013-09-01 29 views
1

在我的Rails应用程序中,我有几个控制器为我的客户组成了一个站点。最终用户和管理员几乎可以使用所有的控制器。哪里是在Rails中存储布局逻辑的最佳地点?

我创建了一个包含导航链接的部分。我的问题是我不希望它们出现在管理部分的内部。使这个棘手的部分是,虽然导航应该出现在像pages/home,/galleries/galleries/5之类的东西,但他们不应该出现在像/pages/new/galleries/5/edit之类的东西上。

到目前为止,我一直在向application.html.erb添加逻辑,但事情已经开始失控,我的if语句中有太多的规则,我觉得很肮脏。这里有一个例子:

从application.html.erb

<% unless current_page?('/') or current_page?('/admin') or current_page?({action: :new}) %> 
    <%= render "layouts/top_links" %> 
<% end %> 

片断这一切到目前为止,我已经写了,但如果我继续这样,它几乎肯定会获得更长。所以这里是我的问题:

  1. 我应该把这个逻辑和我应该怎么称呼它?
  2. current_page?这是最好的方法吗?

回答

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 

完成。

+0

这正是我想要的。 – drewwyatt

+0

我很高兴能有一点帮助。 –

1

您可以使用基于角色的方法来推进,因为它是rails中访问控制最广泛使用的方法。实际上,application.html.erb中的所有那些if-else循环都会有一点代码异味。

查看Ryan Bates CanCan宝石用于此目的。

+0

我真的希望这会工作。无论如何,这可能是我最终做的。不过,这是我的问题:如果管理员访问该网站时未注销,我仍然希望链接显示。条件应该基于位置而不是用户。那有意义吗? – drewwyatt

+0

这样做,但你已经描述了与它自己相关的问题。如果你能管理它,那么根本没有问题! –

1

一种可能性是利用before_filter,您可以在ApplicationController中设置。你可以做什么

应用自己的味道,这一点,但一个愚蠢的例子可能是:

class ApplicationController < ActionController::Base 
    before_filter :set_navigation_visibility 

    def set_navigation_visibility 
     # Your custom logic 
    end 

该方法也可以在子控制器如果需要覆盖,或使用:only:except选项修改。

另一种可能性是利用基于角色的访问控制系统。有很多,我使用的这样一个库是Simple-NavigationA google search for role-based access control for rails似乎产生了一些可能有用的结果。

相关问题