Ruby on rails 如何在ActiveRecord中保存具有多对多关系的标记

Ruby on rails 如何在ActiveRecord中保存具有多对多关系的标记,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我正在尝试创建一个带有多对多标签的视频。因此,每个标记都是tag表中的每一行。我不确定我是否必须自己做,或者Rails有一些魔法可以做到这一点 这是我的模型 class Video < ActiveRecord::Base belongs_to :user has_many :video_tags has_many :tags, through: :video_tags end class Tag < ActiveRecord::Base end class Vid

我正在尝试创建一个带有多对多标签的视频。因此,每个标记都是
tag
表中的每一行。我不确定我是否必须自己做,或者Rails有一些魔法可以做到这一点

这是我的模型

class Video < ActiveRecord::Base
  belongs_to :user

  has_many :video_tags
  has_many :tags, through: :video_tags
end

class Tag < ActiveRecord::Base
end

class VideoTag < ActiveRecord::Base
  belongs_to :video
  belongs_to :tag
end
但后来我犯了一个错误,我想我一定错过了什么。我只想让标签用空格隔开

“视频”=>{“标题”=>“asdfasdf”, “路径”=>“//s3.amazonaws.com/uploads/token/57203191c21df0cacf98f3fa9340f4.mp4”, “标记”=>“测试”},“提交”=>“创建视频”} 在3毫秒内完成500个内部服务器错误

NoMethodError (undefined method `each' for "test ":String):
  app/controllers/videos_controller.rb:14:in `create'

我觉得很有帮助。是的,rails有一种特殊的方法来处理这个问题。这些被称为嵌套模型,或者您也可以使用嵌套形式的gem

您可以对和使用
接受嵌套的属性

 <%= f.fields_for :tags, @_your_tags do |t| %>

而不是

<div class="field">
   <%= f.label :tags %><br>
   <%= f.text_field :tags %>
</div>



您的关联如下:

class Video < ActiveRecord::Base
  belongs_to :user

  has_many :video_tags
  has_many :tags, through: :video_tags
end

class VideoTag < ActiveRecord::Base
  belongs_to :video
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :video_tags
  has_many :videos, through :video_tags
end
class-Video
当您试图从UI创建视频时,是否可以发布您的服务器日志?更新了问题。我没有在视频控制器的第14行中看到每个
。你的问题中有什么东西没有贴在这里吗?我感觉你把你的联系搞砸了。@SharvyAhmed我想是的。我是新来的罗。我想要的是,用户有许多视频,一个视频有许多标签,其中一个标签属于许多视频。这是否意味着我有多个文本字段?是的,有多个文本字段。但是使用一些jQuery输入的标记将帮助您为单个文本字段添加标记,而不是为
f.fields\u添加标记。只有参数需要像,
{videos=>{tags=>['a',b']}}
 <%= f.fields_for :tags, @_your_tags do |t| %>
<div class="field">
   <%= f.label :tags %><br>
   <%= f.text_field :tags %>
</div>
class Video < ActiveRecord::Base
  belongs_to :user

  has_many :video_tags
  has_many :tags, through: :video_tags
end

class VideoTag < ActiveRecord::Base
  belongs_to :video
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :video_tags
  has_many :videos, through :video_tags
end