2017-01-31 38 views
0

Я пытаюсь создать вложенный путь для показа действия вложенного ресурсаRails маршрутов - контекст для вложенного URL ресурса

user.rb

has_many :fan_receives, as: :fanzone_owner, class_name: "FanActivity" 

fan_activity.rb

belongs_to :fanzone_owner, polymorphic: true 

В моем routes.rb

match ":fanzone_owner_id/posts/:id", to: "fan_activities#show", via: :get 

Путь работает, но fanzone_owner_id может быть чем угодно. Для примера,

example.com/1/fan_activities/2 работы
example.com/2/fan_activities/2 также работает
example.com/anythingatall/fan_activities/2 также работает

Я хотел бы сделать это так, fanzone_owner_id из URL должен совпадать с внешним ключом от fan_activity, в противном случае мы перенаправлять 404.

ли я сделать это с помощью проверки обнаружится в URL в контроллере? Я не уверен, правильный ли этот подход.

ответ

0

Я понял, что случилось. Мне просто пришлось использовать params из url в контроллере для действия show.

В fan_activities_controller.rb

@user = User.find(params[:fanzone_owner_id]) 
@fan_activity = @user.fan_receives.find(params[:id]) 

Если пользователь не найден или пользователь не fanzone_owner, то это было бы 404.

0

На основании информации, которую я предложил бы использовать nested routes.

resources :fanzone_owner do 
resources :fan_receive 
end 

Для этого вам надо было также nested attributes готов, в противном случае выше маршрутизации не будет иметь никакого смысла. This tutorial может быть полезно.

+0

В моем случае, все становится немного сложнее потому что fanzone_owner задан как полиморфный, а fan_receives - это еще один класс под названием «fan_activities». Я пробовал использовать вложенные маршруты, но это привело к той же проблеме в вопросе. Моя цель состоит в том, чтобы только маршрут «: show» для fan_receives отображал контекст того, кем является fanzone_owner. – oniiko