Rails 4:在显示页面上确定has_many / belongs_to关系

时间:2015-02-10 01:24:15

标签: ruby-on-rails ruby-on-rails-4

我是一个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]

在漫画模型上编写这些范围会更好吗?甚至可以从我的系列节目页面查询漫画吗?

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定你的路由等等,但我相信这会有用。

<%= link_to "Issue Number", filtered_comics_path(@series, :scope => 'issue_sort') %>

查看您的路线,您不需要传入的@comic变量;你不会使用它。你确实需要你的@series变量。

在您的控制器中,您根据参数[:scope]进行切换,因此您必须提供密钥:范围,以及您希望根据值进行排序的值。

希望有所帮助。