如何让我的控制器更干 - 我想在控制器中使用帮助器--Rails 3

时间:2011-05-25 22:54:46

标签: ruby-on-rails controller dry helper

这是我的控制器。因为控制器包含通过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。

3 个答案:

答案 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

但是,就像其他人所说的那样,这可能最好放在一个部分。