我应该将哪些对象传递给我的link_to以获得三重嵌套路由?我想要检索练习秀页面。
<%= link_to exercise.name, plan_workout_exercise_path(???) %>
resources :plans do
resources :workouts do
resources :exercises
end
end
def show
@workout = Workout.find(params[:id])
end
我尝试过以下操作,但它没有将正确的ID提供给正确的型号。
<%= link_to exercise.name, plan_workout_exercise_path(@plan, @workout, @exercise) %>
答案 0 :(得分:1)
您还必须在show动作中获得@plan
:
在 workout_controller.rb :
中def show
@plan = Plan.find(params[:plan_id])
@workout = Workout.find(params[:id])
end
在exercise_controller.rb中:
def show
@plan = Plan.find(params[:plan_id])
@workout = Workout.find(params[:workout_id])
@exercise = Exercise.find(params[:id])
end
你也可以这样做:
<%= link_to exercise.name, [@plan, @workout, exercise] %>
建议:尝试获取 RailsForZombies 2 幻灯片,它有一个很好的部分,如何处理嵌套路由,或者只是查看指南。
此外,为了获得更清晰的代码,请通过@plan
获取workout_controller.rb
中的@plan
以及@workout
和exercise_controller.rb
中的before_filter
函数class WorkoutsController < ApplicationController
before_filter :get_plan
def get_plan
@plan = Plan.find(params[:plan_id])
end
def show
@workout = Workout.find(params[:id])
end
end
:
{{1}}
就像托马斯所说,试着避开那些深深嵌套的路线。
答案 1 :(得分:1)
如果您使用exercise.name
我假设您正在通过@workout.exercises.each do |exercise|
这样的循环,对吧?
但是,您必须在控制器中定义@plan。
def show
@plan = Plan.find(params[:plan_id])
@workout = @plan.workouts.find(params[:workout_id])
end
然后,
<%= link_to exercise.name, plan_workout_exercise_path(@plan, @workout, exercise)
答案 2 :(得分:1)
避免三重嵌套的一种可能性是构建您的路线,如下所示:
resources :plans do
resources :workouts, except: [:index, :show]
end
resources :workouts, only: [:index, :show] do
resources :exercises
end
你只需要一个级别的嵌套和更容易的链接助手即可获得。
<%= link_to 'Create a new workout', new_plan_workout_path(@plan) %>
<%= link_to workout.name, workout_path(@workout) %>
<%= link_to 'Create a new exercise', new_workout_exercise_path(@workout) %>
<%= link_to exercise.name, workout_exercise_path(@workout, @exercise) %>