Ruby on Rails:使用传递的参数查找记录

时间:2015-07-27 23:27:44

标签: ruby-on-rails ruby

我正在制作一个在线杂志风格的网站,并且很难在我的项目最后部分获得正确的语法。这些关系正在起作用,因为我只是在调用预期的记录时遇到了麻烦。

每个post属于category,其中category_id是外键。当用户点击此链接<%= link_to 'News', categories_path(:category_id => 1) %>时,我希望他们能够转到仅显示posts的索引页面,其中category_id与网址中的参数相匹配。< / p>

我已经在categories_controller.rb乱了几乎两个小时,现在没有运气。任何人都非常善良地把这个菜鸟扔进去?

2 个答案:

答案 0 :(得分:2)

您尝试做的事情有几个组成部分。我们将从路由方面开始,然后转向控制器。

首先,您需要制作正确的路线。由于帖子属于某个类别,因此您需要具有类别ID才能处理对帖子执行任何类型的操作。所以我们需要像/category/:category_id/posts/:id这样的路线。幸运的是,Rails有一些东西可以解决这个问题。如果您在resources中嵌套resources,则会生成这些路线。所以,我们最终得到了这个:

resources :categories do
  resources :posts
end

这将在路线方面为您提供您想要的东西。但现在我们必须实际实施它。所以,我们需要看看控制器。如果您注意到,所有这些路线都有:category_id - 所以查找类别应该不会太困难:

class PostsController < ApplicationController
  before_action :load_category

private

  def load_category
    @category = Category.find(params[:category_id])
  end

end

现在,你已经加载了类别,从那里实现其他方法应该不会太难:

class PostsController < ApplicationController
  before_action :load_category

  def index
    @posts = @category.posts
  end

  def show
    @post = @category.posts.find(id: params[:id])
  end

  # ...
end

为了引用Post索引路径,您必须使用category_posts_path帮助程序。

答案 1 :(得分:0)

您的问题是您正在尝试使用现有路由来处理某些新功能(而这些功能并非偶然设计)。该categories_path路线旨在带您进入类别索引。

您需要在控制器中创建一个方法来执行您想要查看的功能。

class PostsController < ApplicationController
  ...

  def posts_by_category
    @posts_by_category = Post.where("category_id = ?", params[:category_id])
  end

  ...
end

然后您需要一个视图来显示您的@posts_by_category数组(我将此练习留给您)。

现在问题的关键是:你需要一条指向posts_by_category方法的路线。

get 'posts/posts_by_category' => 'posts#posts_by_category'

现在您应该能够使用正确的路线创建链接:

<%= link_to 'News', posts_by_category_path(:category_id => 1) %>