Как использовать путь маршрутов 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 ответа
Поскольку вы не хотите создавать новое представление для нового конкретного продукта, вы можете просто отобразить общее представление для new
действие для всех унаследованных классов STI, поэтому:
class FruitsController < ApplicationController
def new
# do something
render 'fruits/new'
end
Просто сделайте следующее:
#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: url.com/fruits/new?type=apple
-
И наоборот, было бы разумно взглянуть на структуру вашей ИППП, если у вас возникла такая проблема. Вы могли бы быть лучше, используя enum
удалив слой "подкласс", который просто добавит усложнение без причины.
Кстати, вы могли бы использовать polymorphic_path
помощник, если вы хотите использовать помощник пути и настроить его для любого объекта, который вы передаете.