Использование одного и того же метода класса внутри и через JSON в Rails - PullRequest
0 голосов
/ 12 июля 2011

В моем контроллере я хочу использовать один и тот же код как внутри других методов в классе, так и снаружи через JSON.Можно ли объединить их в один метод?

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

class TestController < ApplicationController

  respond_to :json

  def foo_external
    respond_with foo_internal
  end

  def some_other_method
    ...
    q = foo_internal
    ...
  end

  private

  def foo_internal
    return {
      :a => 1,
      :b => 2,
    }
  end

end

Из другогометоды в том же классе, я вызываю foo_internal, но из JavaScript я вызываю foo_external, чтобы вернуть результат в виде JSON.Можно ли объединить их в один метод foo?Примерно так:

class TestController < ApplicationController

  respond_to :json

  def foo
    r = {
      :a => 1,
      :b => 2,
    }
    respond_to do |format|
      format.html { return r }
      format.js { respond_with r }
    end
  end

  def some_other_method
    ...
    q = foo
    ...
  end

end

Этот код работает, когда some_other_method генерирует HTML-ответ, но завершается неудачно, когда some_other_method пытается сгенерировать JSON-ответ.

Я использую Rails 3.

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Этот синтаксис немного длиннее, но теперь он должен работать:

def foo
  respond_to do |format|
    format.html {return {:a => 1, :b => 2}}
    format.js {return {:a => 1, :b => 2}}
  end
end
0 голосов
/ 14 июля 2011

Это кажется невозможным. От друга:

Вы не можете объединить их в один метод, потому что foo_external вызывается как действие (ожидается генерирование ответа HTTP) и foo_internal вызывается как часть другого действия. Если вы попытаетесь чтобы вызвать foo_external из любого другого действия, вы попросите Rails создать два конкурирующих HTTP-ответа.

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