Как я могу сделать свой контроллер более СУХИМ - я бы хотел использовать помощников в контроллере - Rails 3 - PullRequest
1 голос
/ 26 мая 2011

Это мой контроллер.Поскольку контроллер содержит логику для проталкивания строки HTML через API, а этот 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)

Этот набор кода такой жено используется для других ресурсов, поэтому я хотел бы сделать все это СУХОЙ как единый модуль, используемый внутри контроллера.

Я попытался поместить его в помощник, но это не сработало вообще: ssaidвспомогательный метод был неизвестен.

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Я бы поместил HTML внутри партиала, а затем использовал render_to_string в контроллере для его рендеринга и отправки его в LinkedIn.Вы также можете включить соответствующие модули Helper в свой контроллер, но это противоречит принципам MVC, поэтому я рекомендую использовать другой метод.

Ответ выше эквивалентен включению соответствующих модулей Helper, однако этонемного приятнее разделять представления и контроллеры.Ваши контроллеры должны быть тонкими и легкими.Контроллер - просто диспетчер, он на самом деле ничего не «делает», он просто передает все вокруг, чтобы все произошло.Если вы продолжите в том же духе, то очень легко разделить функциональность между действиями и контроллерами.

2 голосов
/ 26 мая 2011

Railscast 132 Показывает, как вы можете использовать вспомогательные методы, такие как link_to внутри контроллера.

1 голос
/ 26 мая 2011

Если я правильно понимаю, вы говорите, что снова и снова используете один и тот же (или похожий) блок кода в других ресурсах.

Один из способов высушить его с помощью того же кода - просто создать для него метод в 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

Но, как уже говорили другие, это, вероятно, лучше всего поставить в частичную.

...