【问题标题】:How can I make my controller more DRY -- I'd like to use helpers within controller -- Rails 3如何让我的控制器更干燥——我想在控制器中使用助手——Rails 3
【发布时间】:2011-09-02 04:18:59
【问题描述】:

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

这组代码是相同的,但用于其他资源,所以我想将这一切都作为控制器内部使用的单个模块进行干燥。

我尝试将它放在帮助器中,但这根本不起作用:ssay 帮助器方法是未知的。

【问题讨论】:

    标签: ruby-on-rails controller dry helper


    【解决方案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
    

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

    【讨论】:

    • 所以我可以把实例化LinkedIn客户端的代码和所有这些东西放在控制器中作为方法吗?并且还部分使用 html 片段?还是其中之一?
    • 两者兼而有之。因为它是在ApplicationController中声明的,所以所有的控制器都可以使用该方法。 helper_method :the_new_method 行使其在视图/部分中也可用。
    【解决方案2】:

    我会将 HTML 放在一个部分中,然后在控制器中使用 render_to_string 来呈现它并将其发送到 LinkedIn。您还可以在控制器中包含相关的 Helper 模块,但这有点违反 MVC 原则,因此我建议您使用其他方法。

    上面的答案相当于包含了相关的 Helper 模块,但是,将视图和控制器分开会更好一些。您的控制器应该轻薄。控制器只是一个调度程序,它并没有真正“做”任何事情,它只是传递事情以使事情发生。如果您保持这种方式,那么在操作和控制器之间共享功能非常容易。

    【讨论】:

    • 即使我也同意这一点,比我的解决方案干净得多。
    • 好的....所以我将创建一个单独的文件 _linkedin_message.erb.html 作为部分文件,然后如何渲染为字符串?谢谢,这似乎是一种方法,但我不熟悉它。
    • 您可以将其渲染为正常的部分,尝试使用 render_to_string "users/linkedin_message", :layout => false 当您需要所有的 html 来显示消息。
    【解决方案3】:

    Railscast 132 展示了如何在控制器内部使用诸如 link_to 之类的辅助方法。

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多