【问题标题】:Render different controller for the same url for different user rails ruby为不同的用户 rails ruby​​ 为相同的 url 渲染不同的控制器
【发布时间】:2013-11-19 06:58:49
【问题描述】:

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

我想向设计人员和管理员用户显示不同的页面,并为普通用户显示相同 url 的不同页面

【问题讨论】:

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


    【解决方案1】:

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

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

    选项 3:根据需要有多大不同的视图以及到目前为止您构建应用程序的方式,您也可以选择presenter。通过一些巧妙的属性命名,这很容易成为维护最简单的解决方案。

    我不想重新编写/复制代码。我如何使用其他控制器的代码并渲染不同的模板 - C J

    您没有提到您已经在某处进行了该操作。然后,您正在寻找可以从两个控制器调用的编写助手 - 现有的和响应此 URL 的控制器。

    【讨论】:

    • 我不想重写/复制代码。我如何使用其他控制器的代码并渲染不同的模板
    • 它回答了你的问题吗?如果您需要更具体的输入,您也应该提供一些代码。
    【解决方案2】:

    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 指向单独的控制器和正确的视图,但没有重复的代码。

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2023-03-11
      • 2012-02-28
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多