在练习Rails时,我遇到了一个问题,我无法解决它,如下所示: - 当我点击类别名称时,我想显示属于该类别的所有帖子(通过外键category_id),我在' post'控制器:
def show_post_category
if params[:category_id]
@categories = Category.find_by(params[:category_id])
@posts = @categories.posts
else
@posts= Post.all
end
end
在视图中,我编写代码以显示类别名称超链接:
<% @categories = Category.all %>
<% @categories.each do |c| %>
<li>
<%= link_to c.name, :controller => "posts", :action => "show_post_category", :category_id => c.id %>
</li>
<% end %>
但是,当我点击类别名称时,会显示错误
'No route matches {:action=>"show_post_category", :category_id=>5,:controller=>"posts"}.
以下是路线文件中的代码:
Rails.application.routes.draw do
resources :posts
resources :categories
resources :categories do
posts do
get 'show_post_category'
end
end
end
我的代码中的问题在哪里?请给我解决方案。
非常感谢你,
答案 0 :(得分:0)
def show_post_category
if params[:id].present?
@posts = Category.find(params[:id]).posts
else
@posts= Post.all
end
end
甚至更短
def show_post_category
@posts = params[:id].present? ? Category.find(params[:id]).posts : Post.all
end
更改路线:get 'show_post_category/:id'
将each
替换为map
<% @categories = Category.all %>
<% @categories.map do |c| %>
<li>
<%= link_to c.name, :controller => "posts", :action => "show_post_category", :id => c.id %>
</li>
<% end %>
答案 1 :(得分:0)
这肯定听起来令人沮丧!
也许您应该尝试指定这是let rec add_half l = match l with
| [ ] -> [ ]
| x::xs -> let x' = float_of_int x
in (x' +. 0.5) :: add_half xs
文件中的集合,如下所示:
routes.rb
让我知道这对你有用。
如果您想进行更深入的研究,请参阅更多有用的文档:http://guides.rubyonrails.org/routing.html
答案 2 :(得分:0)
你可以做得更好。
要创建显示属于某个类别的所有帖子的路线,您需要以下路线:
GET /categories/:category_id/posts
这是宣布nested resource的一种安静方式。
您可以通过以下方式声明路线:
resources :posts do
resources :categories, only: :index, module: :posts
end
module: :posts
告诉Rails我们要使用单独的Categories::PostsController#index
代替PostsController
。
class Categories::PostsController < ApplicationController
before_action :set_category
# GET /categories/:category_id/posts
def index
@posts = @category.posts
end
private
def set_category
@category = Category.includes(:posts).find(params[:category_id])
end
end
在这里使用模块是非常可选的,但它的恕我直言是#34; param嗅探的优秀解决方案&#34;:
class PostsController < ApplicationController
# GET /posts
# and
# GET /categories/:category_id/posts
def index
if params[:category_id]
@posts = Category.includes(:posts).find(params[:category_id])
else
@posts = Post.all
end
end
end
后者违反了单一责任原则。