0

タグが存在する場合にのみ「タグ:」というテキストを表示しようとしているので、ビューで次のようにしました。

<% if @tags.present? %>  
    <%= puts "Tags:"%> 
    <% end %>

これはうまくいきません...私は初心者で、何が間違っているのかわかりません。

ありがとう

編集:

タグはArticleに属します。

タグは私の記事モデルで次のように定義されています:

def tag_tokens
    self.tags.collect{|t| t.name}.join(", ")
  end

  def tag_tokens=(tags_delimited)
    tags_delimited.split(",").each do |string|
            self.article_tags.build(:tag => Tag.find_or_create_by_name(string.strip.downcase))
    end     
  end

記事にタグが付いている場合はタグのリストの前に「Tags:」という単語が表示され、記事にタグがない場合は「Tags:」という単語が表示されないようにしようとしています。 。

<% if @tags.nil %>のところ、すべての投稿に「Tags:」が表示されます。

4

3 に答える 3

4

ビューでputsを使用しないでください。putsを使用すると、テキストがコンソールに送られます。これで修正されます:

<% if @tags.present? %>  
    <%= "Tags:"%> 
<% end %>

また、.presentを使用する必要はありませんか?それの音によって。設定されているかどうかだけを確認したい場合は、.nilを使用する必要がありますか?代わりは。これを1行に要約することもできます。

<%= "Tags:" unless @tags.nil? %>

更新:getterとsetterの両方でtag_tokensメソッドが壊れているようです。セッターは実際には見た目では何も保存していません(.buildは新しいオブジェクトを返します。保存する必要があります)。ゲッターは、見た目で保存しようとしているarticle_tagsではなく、タグも参照しています。これに変更すると、保存に役立つはずです。

self.article_tags.build(:tag => Tag.find_or_create_by_name(string.strip.downcase)).save

これは、次のような行があることを前提としています。

has_many :article_tags
has_many :tags, through: :article_tags

私はあなたがあなたのセッターに基づいて行うと仮定しています。

これは多対多の関係だと思いますが、has_and_belongs_to_manyではなくhas_many:throughを使用しているようです。これには理由がありますか?has_and_belongs_to_manyを使用している場合は、次のことができるはずです。

has_and_belongs_to_many :tags

def tag_tokens=(tags_delimited)
  self.tags = []
  tags_delimited.split(",").each do |string|
    self.tags << Tag.find_or_create_by_name(name: string)
  end
end

その場合、ArticleTagsモデルはまったく存在しないはずであり、プライマリ列がなく、article_id列とtag_id列がないarticles_tagsというテーブルが必要です。

アップデート2:

@tagsを何にも設定していないため、常にnilになっています。@tagsは変数であり、コントローラーのindexメソッドで@articlesが設定されているのと同じように、値を持つように設定する必要があります。とにかく、これはインデックスメソッド用であるため、単一のインスタンス変数にする必要はありません。その特定のインスタンスのtag_tokensメソッドにアクセスする必要があります。app / views / articles / index.html.erbの53〜55行目を次のように変更する必要があります。

<%= "Tags:" if article.tags.any? %>
于 2012-08-12T00:02:17.407 に答える
1

sgrifで答えを確認してください。良い点がたくさんあります。あなたの主な質問に答えるには:

erb(Railsのビューテンプレートに使用される「言語」)では<%= ... %>、Rubyコードの結果をビューテンプレートに補間するために使用できます。

あなたがしているとき:

<%= puts "Tags:" %>

次のことが起こります。

  1. Rubyはコードを評価/実行します: "Tags:"はSTDOUTに出力され、常にnil呼び出しが返されるためputs返されますnil
  2. erbは結果をテンプレートに補間します。結果はnil、「nothing」として表示されます。

これを修正するには、次を使用します。

<% if @tags.present? %>  
  <%= "Tags:"%> 
<% end %>

または、Rubyで何もしていないので、次を使用できます。

<% if @tags.present? %>  
  Tags: 
<% end %>
于 2012-08-12T10:20:38.043 に答える
0

@tagsは何として定義されていますか?どこにあるか確認したいですか?

欲しいですかif @tags.nil?

于 2012-08-11T23:48:59.237 に答える