如何使用STI路由路径?

时间:2015-12-31 22:58:16

标签: ruby-on-rails routes sti

我有一个STI模型

class Fruit < ActiveRecord::Base; end
class Apple < Fruit; end
class Orange < Fruit; end

和路线:

resources :fruits
resources :apples, controller: 'fruits', type: 'Apple'
resources :oranges, controller: 'fruits', type: 'Orange'

脚手架创建使用new_fruit_path创建新水果的视图

当我转到localhost:3000\apples并点击新按钮时,它会转到localhost:3000\fruits\new页面。

有没有办法进入localhost:3000\apples\new页面?我不想创建一个new_apple_path

的新视图

感谢。

2 个答案:

答案 0 :(得分:0)

请执行以下操作:

#config/routes.rb
resources :fruits #-> url.com/fruits/new

#app/controllers/fruits_controller.rb
class FruitsController < ApplicationController
   def new
      @type = params[:type].constantize if params[:type]
      @fruit = @type.new
   end
end

然后您就可以使用:

<%= link_to "New Apple", new_fruit_path(type: "apple") %>

......但在网址中看起来可能很糟糕:url.com/fruits/new?type=apple

-

相反,如果你遇到这样的问题,那么看看你的STI结构是明智的。您最好使用enum,删除&#34;子类&#34;这个层将无缘无故地添加复杂性。

顺便说一下,如果您想使用路径助手并使其适应您传递的任何对象,您可以使用polymorphic_path助手。

答案 1 :(得分:0)

由于您不想为新的特定产品创建新视图,因此您可以为所有STI继承的类呈现new操作的公共视图,因此:

class FruitsController < ApplicationController
   def new
      # do something
      render 'fruits/new'
   end