Как мне переопределить MJE-тип RJS в Rails 2.3? - PullRequest
1 голос
/ 26 февраля 2010

У меня есть приложение под управлением Rails 2.3.5, для которого в большинстве случаев есть JSON API.

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

Проблема в том, что запросы JSON API вызывают ответы RJS, а это не то, что мне нужно. Я бы хотел, чтобы ответы RJS происходили из браузера, но когда это запрос API (в отличие от использования заголовков "application / json" Accept и Content-Type), я бы хотел, чтобы он просто отправлял ответ API.

Из того, что я могу сказать, Rails запускает ответ RJS для любого MIME-типа, который включает в себя javascript, т.е.

текст / JavaScript применение / JSON

и т.д.

Есть ли способ заставить RJS отвечать только на текст / javascript? Или есть лучший способ решить эту проблему?

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

def show
  @dashboard = @user.dashboard
  respond_to do |wants|
    wants.html
    wants.json { render :json => @dashboard }
  end
end

Проблема в том, что в папке просмотра для этого контроллера также есть шаблон show.rjs. Когда кто-то обращается к API, я хочу, чтобы он отображал результаты json, как я перечислил выше, но вместо этого он отображает шаблон show.rjs.

Как я могу убедиться, что клиенты API получают результаты json, которые я хочу, и при этом позволить шаблону RJS отображаться для людей на сайте?

Ответы [ 3 ]

1 голос
/ 03 марта 2010

Вам потребуется json, определенный в вашем mime_types.rb, и тогда вы сможете это сделать:

def show 
  @dashboard = @user.dashboard
  respond_to do |format|
    format.html
    format.json {render :json => @dashboard}
    format.js
  end
end

Подробнее читайте здесь: http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

0 голосов
/ 30 июня 2010

Вы уверены, что ваш javascript отправляет правильные заголовки? Когда я делаю rjs, обычно я делаю это, отвечая на format.js. Это позволяет мне легко разделять ответы json и js.

Как правило, мои проблемы заключались в том, чтобы мои действия ajax действительно отправляли запросы в правильном формате. В случае сомнений вы можете добавить параметр «format»: «js» к вашему запросу. В jQuery:

// try to get it to figure out rjs actions by itself
$('a').click(function(e){
  e.preventDefault();
  $.get({
    url: this.attr('href'),
    dataType: 'script',
    success: responseFunction
  });
});

// or force the format
$('a').click(function(e){
  e.preventDefault();
  $.get({
    url: this.attr('href'),
    data: {format: 'js'},
    success: responseFunction
  });
});
0 голосов
/ 26 февраля 2010

В действии вашего контроллера попробуйте следующее:

def index
  respond_to do |format|
    format.html # Renders index.html.erb as usual
    format.xml  { render :json => {:name => "raskchanky"}.to_json }
  end
end

Согласно документации Rails (http://api.rubyonrails.org/classes/ActionController/Base.html) "render: json" устанавливает тип содержимого ответа на application / json.

...