0

对于三重嵌套路由,我应该将哪些对象传递给我的 link_to?我想检索练习显示页面。

show.html.erb - 锻炼

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

路线.rb

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

锻炼控制器.html.erb

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

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

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

3 回答 3

1

您还必须参加@plan表演活动:

在您的锻炼控制器.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幻灯片,它有一个很好的部分如何处理嵌套路由,或者只是查看指南。

此外,只是为了让代码更简洁,使用回调函数获取@planinworkout_controller.rb和in :@plan@workoutexercise_controller.rbbefore_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

就像 Thomas 说的,尽量避免那些深度嵌套的路线。

于 2013-03-14T21:57:26.187 回答
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)
于 2013-03-14T22:00:01.097 回答
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) %>
于 2013-03-14T22:04:41.207 回答