我正在制作一个在线杂志风格的网站,并且很难在我的项目最后部分获得正确的语法。这些关系正在起作用,因为我只是在调用预期的记录时遇到了麻烦。
每个post
属于category
,其中category_id
是外键。当用户点击此链接<%= link_to 'News', categories_path(:category_id => 1) %>
时,我希望他们能够转到仅显示posts
的索引页面,其中category_id
与网址中的参数相匹配。< / p>
我已经在categories_controller.rb
乱了几乎两个小时,现在没有运气。任何人都非常善良地把这个菜鸟扔进去?
答案 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) %>