我目前正在创建一个可以阅读多个漫画的网站。结构如下(并且正如我所工作的人所要求的那样):首先,你拥有所有的漫画头衔(让我们说,火影忍者,海贼王,一拳等)。然后,当你点击其中一个漫画时,你会看到与漫画相关的章节。然后你终于可以访问漫画的扫描。
困扰我的是我使用了两个不同的脚手架(一个用于漫画,另一个用于章节),但我不知道如何告诉Rails,当一个工作人员想要添加章节到一个漫画,这章与漫画有关。
我决定创建一个指向章节的链接。从漫画的标题(chapters#new
)创作(mangas#show
),并将漫画的ID传递到章节的创建网址,如下所示:
的routes.rb
get '/chapters/new/:manga_id' => 'chapters#new', as: :new_chapter
漫画#展示
<%= link_to 'Add a new chapter', new_chapter_path(@manga.attributes['id']) %>
(因为我使用FriendlyId,这是我能找到的唯一方法来获得真实的id而不是slug)
到目前为止,当我进入chapters#new
操作时,我的网址如下所示:http://localhost:3000/chapters/new/1
,1是通过链接传输的漫画ID。
然后,在控制器中,我按如下方式隔离id:
def create
@chapter = Chapter.new(chapter_params)
if @chapter.save
@chapter.manga = request.original_url.split('/').last.to_i
end
redirect_to @chapter, notice: 'Chapter was successfully created.'
else
render :new
end
end
但是,在提交表单时,我收到以下错误:
Manga(#106972960) expected, got Fixnum(#10269260)
我相信这是因为我在等待整个物体时给了控制器一个号码,但我认为这已经足够了,现在我已经没想完了。
有人有想法吗?
答案 0 :(得分:0)
我建议将您的网站嵌套,这样您就可以对所有重要事项进行CRUD操作。例如,您将拥有漫画模型,章节模型和扫描模型。
漫画模型存储单个漫画,并允许您创建,更新,删除等每个漫画, 章节模型存储Manga模型的各个章节。 扫描模型存储章节的各个扫描。
您不必打破头部建设链接。 Rails为您完成一切。您只需在routes.rb
中将资源(控制器)指定为嵌套 resources :Manga do
resources :Chapter do
resources Scans
end
end
这定义了对所有资源进行CRUD操作所需的所有路由,并且链接按如下方式自动组织:
yourdomain.com/manga/manga_number/chapter/chapter_number/scans/scan_number
当你创建一个新的漫画:
yourdomain.com/manga/new
当您在漫画中创建新章节时:
yourdomain.com/manga/manga_number/chapter/new
在章节中创建新扫描时:
yourdomain.com/manga/manga_number/chapter/chapter_number/scans/new
所有这一切都要归功于将资源嵌套到路由器中。