首先,如果您需要更多细节,请不要犹豫,我会尽量保持清晰。
我创建了一个允许用户创建漫画的网站,通过创建3个支架:一个用于漫画本身,有许多章节,属于漫画,并且里面有很多页面。
为了获得更好的用户体验,我使用章节编号和页码替换URL中的ID,并使用FriendlyID将漫画的名称放在URL中,因此漫画第一章中的第一页将如下所示: localhost:3000/epic-manga/1/1
。
由于所有路由都是嵌套的,因此路由本身需要三个参数:'manga_id','chapter_number'和'page_number'。但是,我没有找到有用的设置漫画变量,因为我虽然Rails知道我在说什么。然而,当我在我的布局中集成页面时,我意识到Rails显示错误的结果:
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'的行(我尝试用'@ chapter.pejis'替换'@ manga.chapters.pejis'但是它让我错误的结果)
我真的没有任何其他想法,我愿意接受任何建议。
提前谢谢!
答案 0 :(得分:1)
你真的非常接近。你刚刚在sed -i "s/'database' *=> *''/'database' => 'testdb'/g" file
行上弄错了你的嵌套错误。如果它们如下所示,您的嵌套查询将起作用:
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
是&#34; @manga.chapters
&#34; (您可以将其视为Collection
)并且该对象不知道如何回复Array
,而pejis
只是一个@chapter
对象,并且它知道与Chapter
的{{1}}关系。
这当然假设您在模型中设置了以下关系(这是我测试上述代码的方式):
pejis