2012-05-30 67 views
1

如果我使用此代碼爲我的應用程序設置標記系統,然後我將如何呈現與我分配給它們的標記的帖子。舉例來說,如果我分配了一個運動的標籤,以一對夫婦的職位,我將如何再渲染分配給它的運動標籤的所有帖子渲染帖子與指定的標記

rails g model tag name:string 
rails g model tagging article_id:integer tag_id:integer 
rake db:migrate 

class Tagging < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :articles, :through => :taggings 
end 

class Article < ActiveRecord::Base 
    has_many :comments, :dependent => :destroy 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings 
    validates_presence_of :name, :content 
    attr_writer :tag_names 
    after_save :assign_tags 

    def tag_names 
    @tag_names || tags.map(&:name).join(' ') 
    end 

    private 

    def assign_tags 
    if @tag_names 
     self.tags = @tag_names.split(/\s+/).map do |name| 
     Tag.find_or_create_by_name(name) 
     end 
    end 
    end 
end 

<p> 
    <%= f.label :tag_names %><br /> 
    <%= f.text_field :tag_names %> 
</p> 
+0

不是答案是'tag.articles'? – PeterWong

+0

會呈現具有特定標籤的帖子嗎? –

+0

與@Chris Mohr的答案類似,它將使用「sports」標籤呈現帖子。 Rails根據'has_many:through'自動生成正確的SQL。您可以檢查開發日誌中生成的SQL是什麼:) – PeterWong

回答

1

也許是這樣的:

# TagsController 
def show 
    @articles = Tag.find_by_name('sports').articles 
end 

# tags/show.html.haml 
- @articles.each do |article| 
    = render :partial => :article 
+0

如果只有一個標籤,例如體育和政治等,那麼該怎麼辦? –

+0

您可能會在show方法中使用tag.id。 '@articles = Tag.find(params [:id])。articles'鏈接到標籤:'tag_url(tag)'。 –

+0

會是<%=渲染tag_url(標籤),sports.articles%>在視圖 –