我是一个Rails新手,在我的第一个项目上工作 - 这是一个跟踪我所有漫画的应用程序。一个“系列”has_many“漫画”和“漫画”属于“系列”。
我正在使用Rails 4和Ruby 2.1.3。
在我的系列节目页面上,我列出了属于该系列的所有漫画。我希望能够将它们排序为发行号或读/未读状态。
所以,我在我的漫画模型中写了以下内容:
class Comic < ActiveRecord::Base
belongs_to :series
validates :number, :title, presence: true, uniqueness: true
scope :issue_sort, -> { joins(:series).order(number: :asc)}
scope :read, -> { joins(:series).issue_sort.where("read == true") }
scope :unread, -> { joins(:series).issue_sort.where("read == false") }
end
我的系列模型看起来像这样:
class Series < ActiveRecord::Base
has_many :comics, dependent: :destroy
validates :name, presence: true, uniqueness: {case_sensitive: false }
end
这一切都在控制台中运行,但我遇到的问题是当我尝试在我的系列节目页面上实现它时。
我很确定我需要设置一个带路由参数的自定义路由。
我的系列控制器中的show动作如下所示:
def show
@series = Series.find(params[:id])
case params[:scope]
when 'issue_sort'
@comics = @series.comics.issue_sort
when 'read'
@comics = @series.comics.read
when 'unread'
@comics = @series.comics.unread
else
@comics = @series.comics.issue_sort
end
end
但我无法让我的路线上班。我在routes.rb文件中尝试了以下三个,这三个都给了我一个错误。
尝试#1
在我的routes.rb文件中:
get '/series/filter/:scope' => "series#show", as: :filtered_comics
在我的演示模板中:
<%= link_to "Issue Number", filtered_comics_path(:issue_sort) %>
尝试#2
在我的routes.rb文件中:
get '/series/:series_id/filter/:scope' => "series#show", as: :filtered_comics
在我的演示模板中:
<%= link_to "Issue Number", filtered_comics_path([@series, :issue_sort]) %>
尝试#3
在我的routes.rb文件中:
get '/series/:series_id/comics/:id/filter/:scope' => "series#show", as: :filtered_comics
在我的演示模板中:
<%= link_to "Issue Number", filtered_comics_path([@series,@comics :issue_sort]) %>
我认为第二次尝试可能是要走的路,但我并不完全确定。设置这种方式,它给我一个错误,写道:
系列#show中的ActionController :: UrlGenerationError 显示/Users/Jean/Documents/coding/my_projects/comics/comics/app/views/series/show.html.erb,其中第6行引发: 没有路由匹配{:action =&gt;“show”,:controller =&gt;“series”,:format =&gt; nil,:id =&gt;“1”,:scope =&gt; nil,:series_id =&gt; [#,:issue_sort]}缺少必需的键:[:scope]
在漫画模型上编写这些范围会更好吗?甚至可以从我的系列节目页面查询漫画吗?
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我不确定你的路由等等,但我相信这会有用。
<%= link_to "Issue Number", filtered_comics_path(@series, :scope => 'issue_sort') %>
查看您的路线,您不需要传入的@comic变量;你不会使用它。你确实需要你的@series变量。
在您的控制器中,您根据参数[:scope]进行切换,因此您必须提供密钥:范围,以及您希望根据值进行排序的值。
希望有所帮助。