我有两个型号
第
class Article < ActiveRecord::Base
mount_uploader :photo, ImageUploader
has_many :comments
has_many :article_tags
has_many :tags, :through => :article_tags
belongs_to :category
validates :title, presence: true
validates :text, presence: true
end
ArticleTag
class ArticleTag < ActiveRecord::Base
belongs_to :article
belongs_to :tag
end
标签
class Tag < ActiveRecord::Base
has_many :article_tags
has_many :articles, :through => :article_tags
end
这就是我在。
中获取标签的方法@article = params[:article]
@tags = params[:tag_ids]
现在真正的问题在于将文章发布到文章表中,以及将与各种文章相关联的标签发布到article_tags表中。
更新
我正在使用simple_form_for gem,它允许我使用关联方法在引导程序中创建多选,因此问题不是将标记放入表单中,而是将它们发布到数据库中(为article_tags创建新行)。我希望能够通过@article.article_tags
检索它们。这就是尝试但我不知道它是否正确。
@article_params = params[:article]
article_params[:tag_ids].each do |tag|
@article_tag = @article.article_tags.build('article_id'=>@article.id,'tag_id'=>tag)
@article_tag.save
end
def article_params
params.require(:article).permit(:title,:category_id,:text, :photo,:tag_ids => [])
end
这必须在创建文章时完成,就像在同一个方法中同时发布到两个表,即文章和article_tags表。
答案 0 :(得分:1)
您可以使用concept of nested attributes in rails来解决此问题。
您可以找到示例/解释on this rails cast
当您使用嵌套属性时,您不需要单独获取控制器中的articles
和tags
,然后担心保存这些属性,rails会自动处理它。
答案 1 :(得分:0)
您有两种选择:
tags
与新article
相关联,则只需填充tag_ids
tags
,则必须使用accepts_nested_attributes_for
现有标签
将现有标签添加到文章很简单:
#app/models/article.rb
class Article < ActiveRecord::Base
has_many :article_tags
has_many :tags, through: :article_tags
validates :title, :text, presence: true #-> declare multiple validations on same line
end
#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
def create
@article = Article.new article_params
@article.save
end
private
def article_params
params.require(:article).permit(tag_ids: [])
end
end
使用collection_singular_ids
属性指定&#34;加入&#34;父母的记录:
#app/views/articles/new.html.erb
<%= form_for @article do |f| %>
<%= f.collection_select :tag_ids, Tag.all, :id, :name %>
<%= f.submit %>
<% end %>
这会将tag
分配给您的新article
,但 将允许您创建新代码。
新标签
如果您希望使用article
创建新代码,则必须accepts_nested_attributes_for
使用fields_for
:
#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
def new
@article = Article.new
@article.tags.build
end
def create
@article = Article.new article_params
@article.save
end
private
def article_params
params.require(:article).permit(tags_attributes: [:name])
end
end
#app/views/articles/new.html.erb
<%= form_for @article do |f| %>
<%= f.fields_for :tags do |t| %>
<%= t.text_field :name %>
<% end %>
<%= f.submit %>
<% end %>
这会创建新的代码,并自动将其与新的article
相关联。