精心设计的嵌套路线

时间:2018-08-06 15:39:25

标签: ruby-on-rails

因此,当前我正在尝试制作一个应用程序,其中每个用户都有自己的待办事项列表和索引页面,这意味着每个人都可以访问用户页面以查看用户的每个任务。

我使用devise并创建了一个带有用户参考的简单模型:

rails g model Todo title:string completed:boolean user:references

当然在todo.rb / user.rb中添加了Emirates_to / has_many

现在,由于我希望每个待办事项索引页面都与用户待办事项相关联,因此我创建了一个嵌套资源,如下所示:

  resources :users do
    resources :todos
  end

访问

http://localhost:3000/users/1/todos/

可以正常工作并显示索引页面。

出现问题:当我将/ users /之后的数字更改为例如2时,即使没有id为2的用户,它仍然可以工作。

任何想法我如何使它动态化,以便/ users /之后的整数表示user_id?以为我做得对,但我想我错过了一些东西。提前致谢!

编辑:

根据要求,TodosController.rb:

class TodosController < ApplicationController
  def index
    @todos = Todo.all
  end

  def new
  end

  def show
    @todo = Todo.find(params[:id])
    @user = @todo.user
  end

  def update
  end

  def edit
  end
end

1 个答案:

答案 0 :(得分:1)

让我们看看您的索引操作:

def index
  @todos = Todo.all
end

它始终显示所有待办事项,因为它对用户一无所知。 应该是:

def index
  @user = User.find(params[:user_id])
  @todos = @user.todos
end

在显示操作中,您首先必须找到用户,在这种情况下,您可以确定所请求的待办事项属于所请求的用户

def show
  @user = User.find(params[:user_id])
  @todo = @user.todos.find(params[:id])
end

您可以将@user = User.find(params[:user_id])重构到before_action回调中,因为您将在所有操作中使用它