【问题标题】:Routes, path helpers and STI in Rails 4.0Rails 4.0 中的路由、路径助手和 STI
【发布时间】:2013-09-28 14:06:06
【问题描述】:

这快把我逼疯了!我有两个型号LionCheetah。两者都继承自Wildcat

class Wildcat < ActiveRecord::Base; end
class Lion < Wildcat; end
class Cheetah < Wildcat; end

这里使用 STI。

它们都通过控制器WildcatsController 进行处理。在那里,我有一个before_filer 可以从params[:type] 和所有其他东西中获取wildcat 的type 以使用正确的类。

在我的routes.rb 中,我创建了以下路线:

resources :lions, controller: 'wildcats', type: 'Lion'
resources :cheetahs, controller: 'wildcats', type: 'Cheetah'

如果我现在想使用从路由(lions_pathlion_pathnew_lion_path 等)获得的路径助手,那么除了 show 和 @ 之外,一切都按预期工作987654335@ 路径。例如lions_path 返回路径/lionsnew 路径返回 /lions/new?type=Lion。与show 路径相同。当我尝试在我的根域中输入 /lions/new 时,它会在后台正确添加类型参数。

所以,我的问题是,如果我使用路径助手,为什么 Rails 会在 url 中添加 type 参数?为什么只针对newshow

我正在使用全新的 Rails 应用程序运行带有 Ruby 2.0 的 Rails 4.0.0。

【问题讨论】:

    标签: ruby-on-rails ruby routes ruby-on-rails-4 sti


    【解决方案1】:

    为什么使用type?为什么不使用继承的控制器?

    resources :lions
    resources :cheetahs
    

    然后

    class LionsController < WildCatsController
    end
    
    class CheetahController < WildCatsController
    end
    
    class WildCatsController < ApplicationController
      before_filter :get_type
    
      def index
        @objs = @klass.scoped
      end
    
      def show
        @obj  = @klass.find(params[:id])
      end
    
      def new
        @obj  = @klass.new
      end
    
      # blah blah
    
      def get_type
        resource = request.path.split('/')[0]
        @klass   = resource.singularize.capitalize.constantize
      end
    

    【讨论】:

    • 天哪。就这么容易。感谢您的快速回答!我只是不想为每个模型创建控制器,因为将来会有大量的控制器。但这解决了它!
    • 我的荣幸。这就是 OOP 的力量 :)。请注意,模板将是通配符。如果你想在索引上使用 Lion 自己的说法,只需在 LionsController 中添加一个空白索引方法即可。但我认为在大多数情况下,一般的观点可以做很多工作。
    • @Hiasinho,忘记添加singularize。此解决方案对路径有一点依赖性,但一旦路径更改,您应该能够克服它。
    • 之前在我的代码中添加了它。但感谢您完成。有趣的是,有时它是多么容易。总是想简单。经验教训。
    • @bswinnerton 应该像resource = request.path.split('/')[1] 一样简单地返回分割路径的第二部分而不是第一部分。
    【解决方案2】:

    我刚遇到这个问题。您可以尝试关闭服务器,删除 /tmp 目录并重新启动。

    Rails routes and controller parameters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多