在Rails中存储布局逻辑的最佳位置在哪里?

时间:2013-09-01 05:39:39

标签: ruby-on-rails

在我的Rails应用程序中,我有几个控制器为我的客户构建一个站点。最终用户和管理员几乎使用所有控制器。

我创建了一个包含导航链接的部分内容。我的问题是我不希望它们出现在管理部分内。使这一点变得棘手的部分是,虽然导航应该出现在pages/home/galleries/galleries/5之类的内容中,但它们不应出现在/pages/new或{{1}之类的内容中}。

到目前为止,我一直在为/galleries/5/edit添加逻辑,但事情已经开始失控,我的if语句中有太多规则,我觉得它很脏。这是一个例子:

来自application.html.erb的

片段

application.html.erb

这是我到目前为止所写的全部内容,但如果我继续这样做,它几乎肯定会变得更长。所以这是我的问题:

  1. 我应该把这个逻辑放在哪里以及如何调用它?
  2. <% unless current_page?('/') or current_page?('/admin') or current_page?({action: :new}) %> <%= render "layouts/top_links" %> <% end %> 是解决这个问题的最好方法吗?

3 个答案:

答案 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-NavigationA google search for role-based access control for rails似乎会产生一些可能有用的结果。