为不同的用户rails ruby​​呈现相同url的不同控制器

时间:2013-11-19 06:58:50

标签: ruby-on-rails ruby-on-rails-3.1

是否可以为不同类型的用户rails ruby​​呈现相同URL的不同控制器和模板。

我希望向设计人员和管理员用户显示不同的页面,并为一般用户显示相同网址的不同页面

2 个答案:

答案 0 :(得分:1)

选项1:将不同类型的用户重定向到同一网址的不同控制器和模板。请注意,这将涉及到浏览器的额外往返。

选项2:对于同一控制器的相同操作,设计人员和管理员只需拥有两个不同的模板。当然,操作必须使用条件语句来正确设置实例变量。

选项3 :根据目前视图的不同程度以及如何构建应用程序,您还可以使用presenter。通过一些聪明的属性命名,这很容易成为最简单的维护解决方案。

  

我不想重写/重复代码。我如何使用其他控制器的代码,并呈现不同的模板 - C J

你没有提到你已经在某处做过那个动作。然后,您正在寻找可以从您的控制器调用的编写帮助程序 - 现有控制器和响应此URL的控制器。

答案 1 :(得分:0)

TL; DR 没有标准的方法,可能是可能的,但肯定不可取。

路由和约束适用于请求,如果设计人员和管理员用户指向相同的网址,则会相同。所以定义路由的标准rails方式不允许你在这里指定不同的约束,除非你在头文件中有你的角色,这将是一件非常糟糕的事情。

话虽如此,您可以使用授权宝石,例如cancan(尚未在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

在控制器中指定允许执行操作的人员。如果你有两个不同的网址/designers/foo/admin/foo,它们应该指向不同的控制器,但可以通过标准的Ruby模块轻松共享代码。

require 'foo_actions'

module Designers
  class FooController
    include FooActions
  end
end

通过这种方式,您可以使用指向独立控制器和正确视图但没有重复代码的干净URL。