2011-05-25 86 views
1

這是我的控制器。因爲控制器包含邏輯通過API來推動一個HTML字符串,而該HTML包含鏈接,面臨的挑戰之一是代表一個的link_to輔助的輸出:如何讓我的控制器更加乾爽 - 我想使用控制器內的幫助器 - Rails 3

client = LinkedIn::Client.new(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET']) 
57  client.authorize_from_access(current_user.atoken, current_user.asecret) 
58  public_profile_url = client.profile(:fields => "public-profile-url").public_profile_url 
59  string = "<a href='#{public_profile_url}'>#{current_user.full_name}</a> has shared: " 
60  string = string + "<a href = 'http://www.domain.com/question/#{@question.id}'>#{@question.title}</a>" 
61  #<a href='http://www.domain.com/review/#{@review.id}'>#{@review.title}</a> " 
62  debugger 
63  client.update_network(string) 

這組代碼是相同的,但所用對於其他資源,所以我想將這個全部DRY作爲控制器內部使用的單個模塊。

我試圖把它放進一個幫手,但根本沒有用:ssaid的幫手方法是無法識別的。

回答

2

Railscast 132說明如何在控制器內部使用helper方法(如link_to)。

3

我會將HTML放入部分內容中,然後在控制器中使用render_to_string將其呈現併發送至LinkedIn。你也可以在你的控制器中包含相關的Helper模塊,但這有點違反MVC原則,所以我建議使用其他方法。

上面的答案等同於包含相關的Helper模塊,但是,保持視圖和控制器分離會更好一點。你的控制器應該很薄,很輕。控制器只是一個調度程序,它並不真正「做」任何事情,它只是通過事情來完成任務。如果以這種方式保留它,在動作和控制器之間共享功能非常容易。

+0

即使我可以同意這一點,比我的解決方案更清潔 – 2011-05-25 23:29:11

+0

好吧....所以我會創建一個單獨的文件_linkedin_message.erb .html作爲一個部分,然後我如何呈現字符串?感謝這看起來像一種方式去,但我不熟悉它。 – Angela 2011-05-27 16:33:26

+0

您將呈現爲正常的部分,當您需要所有該消息的HTML時,嘗試使用render_to_string「users/linkedin_message」,:layout => false。 – 2011-05-28 02:47:50

1

如果我理解正確,你說你在其他資源中反覆使用相同的(或類似的)代碼塊。

一種方法使用相同的代碼是隻讓一個方法是在ApplicationController中(你基本上定義一個輔助方法,但在ApplicationController中定義它幹起來。

class ApplicationController < ActionController::Base 
    ... 

    # The following line makes the method available in the views, too. 
    helper_method :the_new_method 

protected 
    def the_new_method(args) 
    # Put your code here 
    end 
end 

但是,像其他人所說,這可能是最好的部分。

+0

所以我可以把代碼實例化LinkedIn客戶端和所有這些東西作爲控制器中的方法?並在部分使用teh html片段?或者它是一個還是另一個? – Angela 2011-05-27 16:34:21

+0

這是兩個。因爲它是在ApplicationController中聲明的,所有控制器都可以使用該方法。 'helper_method:the_new_method'這一行也使它在視圖/部分中可用。 – venables 2011-05-27 16:55:37