如何将数据从一个脚手架传递到另一个脚手架?

时间:2016-12-16 00:07:44

标签: ruby-on-rails scaffold

我目前正在创建一个可以阅读多个漫画的网站。结构如下(并且正如我所工作的人所要求的那样):首先,你拥有所有的漫画头衔(让我们说,火影忍者,海贼王,一拳等)。然后,当你点击其中一个漫画时,你会看到与漫画相关的章节。然后你终于可以访问漫画的扫描。

困扰我的是我使用了两个不同的脚手架(一个用于漫画,另一个用于章节),但我不知道如何告诉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)

我相信这是因为我在等待整个物体时给了控制器一个号码,但我认为这已经足够了,现在我已经没想完了。

有人有想法吗?

1 个答案:

答案 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

所有这一切都要归功于将资源嵌套到路由器中。