这是我的控制器。因为控制器包含通过API推送HTML字符串的逻辑,并且HTML包含链接,所以其中一个挑战是表示link_to帮助器的输出:
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作为控制器内部使用的单个模块。
我尝试将它放在帮助器中,但这根本不起作用:ssid helper方法是unknwn。
答案 0 :(得分:3)
我会将HTML放在局部,然后在控制器中使用render_to_string
来呈现它并将其发送到LinkedIn。您也可以在控制器中包含相关的Helper模块,但这有点违反MVC原则,所以我推荐使用其他方法。
上面的答案相当于包含相关的Helper模块,但是,将视图和控制器分开可以更好一些。你的控制器应该轻薄。控制器只是一个调度员,它并不真正“做”任何东西,它只是传递事物来实现。如果你保持这种方式,在动作和控制器之间共享功能非常容易。
答案 1 :(得分:2)
Railscast 132展示如何在控制器中使用link_to等辅助方法。
答案 2 :(得分: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
但是,就像其他人所说的那样,这可能最好放在一个部分。