【发布时间】:2013-11-19 06:58:49
【问题描述】:
是否可以为不同类型的用户 rails ruby 为相同的 url 呈现不同的控制器和模板。
我想向设计人员和管理员用户显示不同的页面,并为普通用户显示相同 url 的不同页面
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3.1
是否可以为不同类型的用户 rails ruby 为相同的 url 呈现不同的控制器和模板。
我想向设计人员和管理员用户显示不同的页面,并为普通用户显示相同 url 的不同页面
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3.1
选项 1: 将不同类型的用户重定向到相同 URL 的不同控制器和模板。请注意,这将涉及到浏览器的额外往返。
选项 2: 只需为设计人员和管理员提供两个不同的模板,用于同一控制器的相同操作。当然,动作必须使用条件语句来正确设置实例变量。
选项 3:根据需要有多大不同的视图以及到目前为止您构建应用程序的方式,您也可以选择presenter。通过一些巧妙的属性命名,这很容易成为维护最简单的解决方案。
我不想重新编写/复制代码。我如何使用其他控制器的代码并渲染不同的模板 - C J
您没有提到您已经在某处进行了该操作。然后,您正在寻找可以从两个控制器调用的编写助手 - 现有的和响应此 URL 的控制器。
【讨论】:
TL;DR没有标准的方法来做到这一点,可能是可行的,但肯定不建议这样做。
路由和约束作用于 request,如果它指向同一个 URL,那么对于设计者和管理员用户来说都是一样的。因此,定义路由的标准 rails 方法不允许您在此处指定不同的约束,除非您将角色放在标头值中,否则这样做是非常糟糕的。
话虽如此,您可以使用像 cancan 这样的授权 gem(Rails 4 上尚不可用),它可以让您做类似的事情
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %>
<% end %>
在视图中和
def show
@article = Article.find(params[:id])
authorize! :read, @article
end
在控制器中指定允许谁执行操作。如果您有两个不同的 url /designers/foo 和 /admin/foo,它们应该指向不同的控制器,但可以通过标准 Ruby 模块轻松共享代码。
require 'foo_actions'
module Designers
class FooController
include FooActions
end
end
这样你有干净的 URL 指向单独的控制器和正确的视图,但没有重复的代码。
【讨论】: