Ruby on Rails(三)隐藏部分视图

Posted

技术标签:

【中文标题】Ruby on Rails(三)隐藏部分视图【英文标题】:Ruby on Rails (3) hiding parts of the view 【发布时间】:2011-01-18 00:14:27 【问题描述】:

我正在开发一个 Ruby on Rails 3 Web 应用程序。

我有一个名为 User 的表和一个名为 role 的列。我正在寻找对视图的这些部分具有“错误”角色的用户隐藏视图部分的最佳方法。

例如,我希望所有用户都能看到用户 index 页面,但我希望只有具有角色的用户 - admin 能够编辑其他用户。

首先我使用filter_by 阻止edit 操作,但我还想要使edit 按钮不出现。

当前用户保存在会话中,因此检查用户角色非常简单。

我要问的是,除了在我要隐藏的每个按钮之前明显的 if 语句之外,还有一种简单的方法可以做到这一点。我认为 Rails 有一种简单的方法来做这种事情,但我找不到。

【问题讨论】:

【参考方案1】:

您可能想要使用 Devise 和 CanCan。

https://github.com/plataformatec/devise

https://github.com/ryanb/cancan

这是 RailCast 教程

http://railscasts.com/episodes/192-authorization-with-cancan

【讨论】:

谢谢,但我正在寻找更多的默认内置类型答案。 @nayish Ruby 或 Rails 没有为此“内置”任何东西。您可以编写自己的授权系统或使用现有的系统,例如 Nerian 链接的 CanCan。【参考方案2】:

如果你想稍微清理一下,你可以为自己编写一个应用程序助手:

  def if_admin(user)
    if(user.is_admin? && block_given?)
      yield
      return
    end
  end

那么在你看来你可以这样写:

  <% if_admin(@user) do %>
    <some admin only html />
  <% end %>

【讨论】:

该方法没有user 参数,不将块作为参数捕获会更高效。您可能希望这样做:def display_if_admin(user); yield if block_given? &amp;&amp; user.admin?; end; 那么函数会使用什么user?我在哪里设置特定用户? @nayish 您将在控制器中抓取的用户对象传递给视图中的if_admin() 方法。 is_admin? 方法将在您的 User 模型类中定义。 此方法是否可用于任何视图,包括用户视图之外的视图? 是的,如果你把它放在application_helper.rb。任何其他助手,它只会自动可供该助手的相应控制器使用。不过,您将需要始终将用户对象传递给它。

以上是关于Ruby on Rails(三)隐藏部分视图的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 的隐藏特性 [关闭]

在 Slim 中使用 Ruby on Rails 有条件地创建隐藏属性

使用 js/jquery 在 ruby​​ on rails 中隐藏 form_tag 上的提交按钮

如何隐藏radio_button并使用div / label作为按钮? (Ruby on Rails)

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

在 Ruby on Rails 3.2+ 中流式传输部分视图