0

寄稿者とhas_manyの関係にあるパブリケーションモデルがあります。モデルには、html対応の行を作成するためのメソッドがあります。

def authors
  authors = []
  Contributor.where(:publication_id => self.id).each do |author|
    authors << "link_to "+author.name+", Contributor.find("+author.id.to_s+")"
  end
  authors.to_sentence
end

私の見解では、私は次の行を持っています:

by <%= @publication.authors %>

ただし、リンクをレンダリングする代わりに、次のような生のコードをレンダリングします。

by link_to B, Contributor.find(1)

@ publication.authorsの最後に.html_safeを追加してパッチを適用しようとしましたが、役に立ちませんでした。これらのリンクをモデルからビューに転送するためのより良い方法はありますか?

4

2 に答える 2

3

authors文字列を配列にプッシュしています。有効なコードのように見えるので、実行evalするとうまくいくはずです。(実際author.nameにはおそらく未定義のシンボルとして評価されるので、それをスクラッチします。)

より良い方法はhas_many :authors, :model => 'Contributor'、モデルでリレーションシップを使用することであり、呼び出すだけPublicationでオブジェクトの配列を表示できます。Contributor

@publication.authors

次のように、ビューでこれらを反復処理する必要があります。

<% @publication.authors.each do |author| %>
  <%= link_to author.name, author %>
<% end %>

このようにビューに複数のPublicationオブジェクトを表示している場合Publication.includes(:authors)は、「N + 1」の問題を回避するために、それらを取得するときにコントローラーで使用する必要があることに注意してください。

さて、3 行のコードを繰り返すのはそれほどコストがかからないように見えますが、MVC パターンに違反したりモデルを乱雑にしたりせずに DRY する方法があります。

  • 出版物の著者を出力するコードをパーシャルに配置し、必要に応じてパーシャルを呼び出します。
  • コードをヘルパーに配置し、ヘルパーを含めて、必要に応じてメソッドを呼び出します。

ソースからのスニペットを次に示しto_sentenceます(ニーズに合わせて調整できると思います):

case length
  when 0
    ""
  when 1
    self[0].to_s.dup
  when 2
    "#{self[0]}#{options[:two_words_connector]}#{self[1]}"
  else
    "#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
end

完全なソースはここにあります。

于 2012-11-19T18:49:12.873 に答える
2

行でhaml構文を使用しようとしているようです。link_to を使用する代わりに、html ハイパーリンク タグ自体を使用することはできますか?

そうは言っても、なぜモデルがhtmlを返すのですか?

編集:bdaresは私が言おうとしていたことですでに答えました

于 2012-11-19T18:49:26.753 に答える