url_for в JSON для модели - PullRequest
       3

url_for в JSON для модели

1 голос
/ 03 августа 2011

Прежде чем идти дальше, я погуглил это.Я знаю аргументы, почему вы не должны располагать url_for в модели, так как это, по-видимому, нарушает парадигму MVC.В этом случае я не согласен, так как он функционирует скорее как API для некоторых ресурсов, а не как пользовательский интерфейс.

Я создал собственный респондент и возвращаю объект JSON, который выглядит следующим образом для каждого запроса:

  obj = {
    json: resource.as_json,
    request_url: params[:id] ? resource_url : collection_url,
    partial: get_partial(:partial, options),
    flash: flash,
    flash_partial: get_partial(:flash, options),
    user: @current_user,
    status: response.status,
  }

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

Я думаю, что лучший способ сделать это - на стороне модели, так как кажется, что Rails этого хочет.Просто добавьте функцию с URL-адресом, а затем используйте as_json (: method =>: url).К сожалению, url_for недоступен на стороне модели, и я не смог найти совместимый с Rails3.1 способ включения его в ActiveRecord :: Base.

class << ActiveRecord::Base
  def url
    url_for self
  end
end

Model.new.as_json(:includes => :url)

Я также открыт для альтернативных предложений.

1 Ответ

8 голосов
/ 04 августа 2011

Это похоже на работу ... Это немного взломать IMO:

class << ActiveRecord::Base
  include Rails.application.routes.url_helpers
  include ActionDispatch::Routing::UrlFor

  def default_url_options
    { :host => 'localhost:3000' }
  end

  def url
    url_for(self)
  end

  def as_json options
    super options.merge(:methods => :url)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...