Rails не магия, где живет метод? - PullRequest
1 голос
/ 10 ноября 2010

У меня есть хороший функциональный и проверенный код Ruby, который я хотел бы интегрировать в проект rails:

require 'open-uri'

def shorten(url)
  open("http://is.gd/api.php?longurl=#{url}").read
rescue
  nil
end

Я хочу вызвать метод shortten (url) из show.html.erbследующим образом:

<% @shorturl = shorten("http://www.google.com/search?q=#{@bands.item.gsub(' ', '+')}+san+francisco") %>

Я думал, что размещение метода сокращается, внутри модели будет работать, но это приводит к NoMethodError (требуемый open-uri помещенthe application_controller.rb)

undefined method `shorten' for #<ActionView::Base:0x1037e66a8>

Где должен жить этот метод?Как я могу заставить это работать?И какую книгу или ресурс вы порекомендуете, чтобы Rails казался менее волшебным.Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

Мой опыт таков: если метод работает с данными базы данных, лучше всего перенести его в модель. Даже если речь идет об обработке данных из данных базы данных, рекомендуется переместить их в модель, если это возможно, чтобы иметь «худой контроллер» и «худой взгляд», если это возможно.

Если метод предназначен для общей помощи в отображении чего-либо, то он принадлежит «помощнику» ... например, метод h является классическим примером «помощи коду представления». Вы можете добавить такие методы в файл помощника приложения, который является app/helpers/application_helpers.rb

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

2 голосов
/ 10 ноября 2010

Ну, если это метод, который принадлежит модели, то это либо метод класса, либо метод экземпляра:

Метод класса

#some controller
MyModel.method(...)

#MyModel
def self.method(...)
  ...
end

Метод экземпляра

#some controller
@myInstance = MyModel.find...(...)
@myInstance.method(...)

#MyModel
def method(...)
  ...
end

Если его нельзя поместить ни в одну модель, я рекомендую помощника, подобного 能量 能量 сказал.

0 голосов
/ 10 ноября 2010

Ответ pretty pretty довольно хороший, поэтому я просто добавлю, что если вы хотите изучить некоторые рельсы, посмотрите это бесплатное онлайн-руководство, которое шаг за шагом проведет вас через создание клона Twitter: http://railstutorial.org/book

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

Так что мой совет - сначала изучить Ruby, а затем - Rails. Это будет НАМНОГО менее расстраивающим и волшебным видом. Вот некоторые из моих любимых книг по Ruby:

Программирование Ruby 1.9
Метапрограммирование Ruby
Рефакторинг: Ruby Edition

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...