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? && user.admin?; end;
那么函数会使用什么user
?我在哪里设置特定用户?
@nayish 您将在控制器中抓取的用户对象传递给视图中的if_admin()
方法。 is_admin?
方法将在您的 User 模型类中定义。
此方法是否可用于任何视图,包括用户视图之外的视图?
是的,如果你把它放在application_helper.rb
。任何其他助手,它只会自动可供该助手的相应控制器使用。不过,您将需要始终将用户对象传递给它。以上是关于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?