在Rails 5

时间:2018-08-01 16:44:19

标签: ruby-on-rails ruby forms activerecord belongs-to

我正在尝试在Rails 5中以这种Railscast的样式创建{@ {3}}。

我的应用是用户共享艺术家对其他艺术家的报价的一种方式。例如,鲍勃·迪伦(Bob Dylan)引用约翰·列侬(John Lennon)的话。这样,我的Artist模型的设置方式允许艺术家同时成为报价中的SpeakerTopic,每个报价belongs_to分别是演讲者或主题。

这是我的Artist模型中的相关代码:

class Artist < ApplicationRecord
  has_many :spoken_quotes, class_name: "Quote", foreign_key: :speaker_id
  has_many :topic_quotes,  class_name: "Quote", foreign_key: :topic_id
end

这是我的Quote模型中的相关代码:

class Quote < ApplicationRecord
  belongs_to :speaker,  class_name: "Artist"
  belongs_to :topic,    class_name: "Artist"

  validates  :speaker_id, presence: true
  validates  :topic_id,   presence: true

  validate   :topic_cant_be_a_speaker

  private

    def topic_cant_be_a_speaker
      errors.add(:topic, 'can\'t be the same as the speaker. We don\'t allow
        artists to talk about themselves ;)') if speaker == topic
    end
end

我可以像这样创建新的Quote以及与Speaker的{​​{1}}和Topic关联:

collection_select

但是,这需要在数据库中创建<%= f.collection_select :speaker_id, Artist.order(:name), :id, :name, {prompt: 'Select an artist'}, {class: 'form-control select-artist'} %> <%= f.collection_select :topic_id, Artist.order(:name), :id, :name, {prompt: 'Select an artist'}, {class: 'form-control select-artist'} %> 。但是,我希望用户能够创建一个新的Artist(如果尚不存在),并通过使用{自动将Artist与该艺术家作为Quote关联{1}}格式(如Auto-Complete Association)。在我的情况下,Speaker QuoteQuote的{​​{1}}。

如果已经在数据库中创建了Artist,我可以通过belongs_to获得Quote表单来创建关联,但是我不知道如何通过Quote表单来创建艺术家。

我已经尝试按照Railscast Railscast Auto-Complete Association的建议进行操作,并且还尝试在Quote模式中使用Speaker,但是它不起作用。

我不知道这是我做错的事情,是与Rails 5与Railscast中的版本有何不同有关,还是我与{{1 }}和Artist模型,其中Artist具有text_fieldaccepts_nested_attributes_for :speaker的特殊类。

做这样的事情的“铁轨方式”是什么?

以下是相关代码的完整来源:

0 个答案:

没有答案