首先,如果您需要更多详细信息,请不要犹豫,我会尽量清晰。
我创建了一个网站,该网站允许用户通过创建3个脚手架来创建芒果:一个用于漫画本身,其中有许多章节,属于漫画,其中包含许多页面。
为了获得更好的用户体验,我替换了URL中的ID,并用章节编号和页码替换ID,并使用FillydiD将漫画的名称在URL中列出,因此漫画的第一章中的第一页看起来如下:localhost:3000/epic-manga/1/1
。
由于所有路线都是嵌套的,因此路线本身需要三个参数:'Manga_id','Chapter_number'和'page_number'。但是,我发现设置漫画变量并没有用,因为我知道我在说什么。但是,当我将页面集成在布局中时,我意识到铁轨显示错误的结果:
private
#Peji stands for 'page' in japanese, don't ask
def set_peji
@chapter = Chapter.find_by(chapter_number: params[:chapter_id])
@peji = @chapter.pejis.find_by(scan_number: params[:id])
end
Rails Doc说," Find_by"将选择与其研究相匹配的第一个项目。加载页面时,SQL请求如下:SELECT 'chapters'.* FROM 'chapters' WHERE 'chapters'.'chapter_number' = 1 LIMIT 1
。但是,每个芒果至少都有第一章。
我最大的问题是我真的不知道如何设置'set_peji'函数以将搜索限制为拥有章节/页面的漫画,因此我尝试了以下内容:
def set_peji
@manga = Manga.find_by(slug: params[:manga_id])
@chapter = @manga.chapters.find_by(chapter_number: params[:chapter_id])
@peji = @manga.chapters.pejis.find_by(scan_number: params[:id])
end
但是,结果我有一个错误: undefined method 'pejis' for #<Chapter::ActiveRecord_Associations_CollectionProxy:0x007fbe30667380>
在靶向包含" @peji"的行时(我尝试替换'@manga.chapters.pejis'by'@chapterch.pepejis'
我真的没有其他想法,我对任何建议都开放。
预先感谢您!
您实际上真的很接近。您刚刚在peji
线上错误地嵌套了。如果您的嵌套查询看起来像这样:
def set_peji
@manga = Manga.find_by(slug: params[:manga_id])
@chapter = @manga.chapters.find_by(chapter_number: params[:chapter_id])
@peji = @chapter.pejis.find_by(scan_number: params[:id])
end
您在@manga.chapters.pejis
上遇到错误的原因是@manga.chapters
是" Collection
"(您可以将其视为Array
),并且该对象不知道如何响应pejis
,而@chapter
只是一个单个Chapter
对象,并且它意识到pejis
与chapter
的关系。
这当然假设您在模型中已经设置了以下关系(这是我测试上述代码的方式):
# app/models/manga.rb
class Manga < ActiveRecord::Base
has_many :chapters
end
# app/models/chapter.rb
class Chapter < ActiveRecord::Base
belongs_to :manga
has_many :pejis
end
# app/models/peji.rb
class Peji < ActiveRecord::Base
belongs_to :chapter
end