2012-11-19 44 views
1

我有一個與發佈者has_many關係的發佈模型。在模型中,我有一個的意思創建一個方法的HTML,準備好行:Rails:在模型中創建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) 

我已經嘗試通過增加.html_safe到@ publication.authors結束脩補這個,但無濟於事。有沒有更好的方式將這些鏈接從模型轉移到視圖?

+1

如果您正在創建中的「模型」的迴應已經回答了,那麼它是不是MVC。它只是帶有ORM的經典意大利麪代碼。 –

+0

在「模型」層生成HTML是不好的做法,因爲生成表示是幫助者和意見的責任 –

+0

這很好理解。我在最後一天一直在研究助手,他們似乎在鐵軌方面聲譽不盡相同。像[this]這樣的文章(http://nicksda.apotomo.de/2011/10/rails-misapprehensions-helpers-are-shit/)和[this](http://blog.steveklabnik.com/posts/2011- 09-09-better-ruby-presenters)不要將它們投射在最佳光線下。但是,他們的擔心可能被誇大了? – nullnullnull

回答

3

您正在將字符串推入authors陣列。它看起來像有效的代碼,所以運行eval就可以了應該工作。 (其實author.name可能會評估爲未定義的符號,所以從頭開始。)

一個更好的辦法是使用你的Publication模型has_many :authors, :model => 'Contributor'關係,你可以通過簡單地調用

帶給您 Contributor對象數組
@publication.authors 

你想要遍歷這些在你看來像這樣:

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

還要注意的是,如果你顯示多個以這種方式查看210個對象,當您檢索它們以避免「N + 1」問題時,您需要在控制器中使用Publication.includes(:authors)。現在

,三行代碼似乎並沒有重複很貴,但有辦法晾乾,沒有違反MVC模式和搞亂你的模型:

  • 放置代碼以打印出版物的作者分成部分,根據需要調用部分。
  • 將代碼放入幫助程序中,包含幫助程序並根據需要調用方法。

下面是從源頭上爲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 

完整的源代碼可以發現here

+0

感謝您的反饋!我以這種方式處理問題的原因是因爲作者列表出現在許多不同的視圖中,我寧願不重複創建此列表所需的代碼。採用單一方法會更高效,更易於維護。我會更深入地研究eval,看看是否有辦法讓我的代碼能夠工作。 – nullnullnull

+0

我已經將代碼放入了部分代碼中,但問題仍然存在。如果回頭看原始代碼,最後會注意到「authors.to_sentence」這一行。這就是爲什麼我把鏈接放入一個數組中,我懷疑這也是爲什麼我得到原始代碼而不是呈現鏈接。可能有更好的方法來實現to_sentence? – nullnullnull

+0

我最終創建了一個詳細的if-then樹,它複製了to_sentence的效果。它的作品,但感覺非常哈克。如果你不知道更好的解決方案,我會在幾個小時後繼續接受這個解決方案。這種方法工作得很好,你的解釋是徹底和清晰的。 – nullnullnull

2

它看起來像你試圖在你的行中使用哈姆語法。也許不是使用link_to,而是使用html超鏈接標籤本身?

這就是說,爲什麼你有一個模型返回HTML?

編輯:bdares什麼我想說