Как использовать путь маршрутов 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 помощник, если вы хотите использовать помощник пути и настроить его для любого объекта, который вы передаете.

Другие вопросы по тегам