1

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

我创建了一个包含导航链接的部分。我的问题是我不希望它们出现在管理部分内。使这件事变得棘手的部分是,导航应该出现在类似的东西上pages/home/galleries或者/galleries/5它们不应该出现在类似/pages/new或 的东西上/galleries/5/edit

到目前为止,我一直在application.html.erb为 . 这是一个例子:

来自 application.html.erb 的片段

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

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

  1. 我应该把这个逻辑放在哪里,我应该怎么称呼它?
  2. current_page?最好的方式来解决这个问题吗?
4

3 回答 3

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

完毕。

于 2013-09-01T05:59:31.997 回答
1

您可以使用基于角色的方法进行改进,因为它是 Rails 中使用最广泛的访问控制方法。事实上,所有那些 if-else 循环application.html.erb无论如何都会有点代码味道。

为此目的检查 Ryan Bates CanCan gem。

于 2013-09-01T05:50:54.477 回答
1

一种可能性是使用before_filter,您可以在ApplicationController. 你可以做什么

对此应用您自己的风格,但一个愚蠢的例子可能是:

class ApplicationController < ActionController::Base
    before_filter :set_navigation_visibility

    def set_navigation_visibility
        # Your custom logic
    end

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

另一种可能性是使用基于角色的访问控制系统。有很多,我使用过的一个这样的库是Simple-Navigation谷歌搜索基于角色的 Rails 访问控制似乎产生了许多可能有用的结果。

于 2013-09-01T05:55:48.593 回答