我正在尝试创建一个Rails应用程序,人们可以通过章节阅读漫画。为此,我创建了3个支架:一个用于漫画本身,另一个用于章节,最后一个用于页面。我嵌套了资源,所以看起来如下:
resources :mangas do
resources :chapters do
resources :pejis
end
end
但是,我想创建一个系统,每当有人在同一个漫画中添加新章节时,该系统会自动递增chapter_number
(章节类中的一列)。
所以我创建了一个函数another_one
来计算同一个manga_id存在多少个章节(这个章节来自巫术漫画的专栏(一个漫画has_many:章节,章节belongs_to:漫画)。
之后,它只是将1添加到它找到的内容然后将结果保存在chapter_number
内。
但是,我有一个问题:因为manga_id可以是动态的,无论我选择在漫画中添加一些章节还是其他章节,我需要在我的函数中指定它,如下所示:
chapter.rb
def another_one
self.class.where(:manga_id => @manga).count + 1
end
使用此参数,即使它没有返回任何错误,它也无法正常工作。但是,如果我添加(即)4而不是@manga
,它将完美地工作。
我的问题是:有没有办法动态传递这种变量,因为find(params[:id]
在模型中不起作用?如果没有,我怎样才能让它以另一种方式运作?
这是我的控制器,以防万一
def create
@manga = Manga.find(params[:manga_id])
@chapter = Chapter.new(chapter_params)
@chapter.manga = @manga
@chapter.chapter_number = @chapter.plus_un
if @chapter.save
(params[:images] || []).each_with_index do |image, index|
@chapter.pejis.create(image: image, scan_number: index + 1)
end
redirect_to manga_chapter_path(@manga, @chapter), notice: 'Chapter was successfully created.'
else
render :new
end
end
答案 0 :(得分:2)
@chapter.chapter_number = @manga.chapters.count + 1
答案 1 :(得分:1)
如果您希望模型负责计算它自己的序列号,您可以使用belongs_to
关系的访问器。
before_create :set_chapter_number
def set_chapter_number
self.chapter_number = self.manga.chapters.length + 1
end
我个人认为这种方法不灵活......如果你实现了插入新章节,删除章节或重新组织章节的能力。在这种情况下,您可能会发现act as list gem是一种更好的方法。