应该将哪些对象传递给具有三重嵌套路由的link_to?

时间:2013-03-14 21:46:23

标签: ruby-on-rails routes link-to nested-routes

我应该将哪些对象传递给我的link_to以获得三重嵌套路由?我想要检索练习秀页面。

show.html.erb - 锻炼

<%= link_to exercise.name, plan_workout_exercise_path(???) %>

的routes.rb

resources :plans do
 resources :workouts do
   resources :exercises
 end
end

workouts_controller.html.erb

def show
    @workout = Workout.find(params[:id])  
end

我尝试过以下操作,但它没有将正确的ID提供给正确的型号。

<%= link_to exercise.name, plan_workout_exercise_path(@plan, @workout, @exercise) %>

3 个答案:

答案 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以及@workoutexercise_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) %>