我正在尝试在Rails 5中以这种Railscast的样式创建{@ {3}}。
我的应用是用户共享艺术家对其他艺术家的报价的一种方式。例如,鲍勃·迪伦(Bob Dylan)引用约翰·列侬(John Lennon)的话。这样,我的Artist
模型的设置方式允许艺术家同时成为报价中的Speaker
和Topic
,每个报价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
Quote
是Quote
的{{1}}。
如果已经在数据库中创建了Artist,我可以通过belongs_to
获得Quote表单来创建关联,但是我不知道如何通过Quote表单来创建艺术家。
我已经尝试按照Railscast Railscast Auto-Complete Association的建议进行操作,并且还尝试在Quote模式中使用Speaker
,但是它不起作用。
我不知道这是我做错的事情,是与Rails 5与Railscast中的版本有何不同有关,还是我与{{1 }}和Artist
模型,其中Artist具有text_field
和accepts_nested_attributes_for :speaker
的特殊类。
做这样的事情的“铁轨方式”是什么?
以下是相关代码的完整来源: