【问题标题】:How to pass datas dynamicly to another model?如何将数据动态传递给另一个模型?
【发布时间】:2016-12-18 17:45:35
【问题描述】:

我正在尝试创建一个 Rails 应用程序,人们可以在该应用程序上通过章节阅读漫画。为此,我创建了 3 个脚手架:一个用于漫画本身,另一个用于章节,最后一个用于页面。我嵌套了资源,如下所示:

  resources :mangas do
    resources :chapters do
      resources :pejis
    end
  end

但是,我想创建一个系统,每次有人向同一漫画添加新章节时,自动递增 chapter_number(章节类中的一列)。

所以我创建了一个函数,another_one,来计算有多少章节具有相同的 manga_id(从女巫漫画中说明章节来自的列(漫画 has_many :chapters,章节 belongs_to :manga)。

之后,它只是将找到的结果加 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

【问题讨论】:

  • 你想在哪里调用 add_another?
  • 你想在哪里调用 self.class.where(:manga_id => @manga.id).count + 1 ?
  • 哎呀,忘了说,我在章节模型里面设置了这个功能

标签: ruby-on-rails parameters model


【解决方案1】:
@chapter.chapter_number = @manga.chapters.count + 1

【讨论】:

  • 你不知道我现在有多愚蠢。该死的。非常感谢!
【解决方案2】:

如果您希望模型负责计算它自己的序列号,您可以使用 belongs_to 关系的访问器。

before_create :set_chapter_number

def set_chapter_number
  self.chapter_number = self.manga.chapters.length + 1
end

虽然我个人认为这种方法不灵活......如果您实现了插入新章节、删除章节或重新组织章节的能力会怎样。在这种情况下,您可能会发现 act as list gem 会是更好的方法。

【讨论】:

  • 我昨天尝试了你的答案,但由于未知原因它没有很好地工作。但是,我似乎正在寻找你链接我的宝石,所以你值得一票! :)
猜你喜欢
  • 2021-12-13
  • 2021-10-06
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多