Как включить HTML в ответ JS Rails? - PullRequest
14 голосов
/ 19 ноября 2008

У меня есть FooController, который отвечает на запросы HTML и JS (AJAX):

# app/controllers/foo_controller.rb:
class FooController < ApplicationController
  layout 'foo'
  def bar
    respond_to do |format|
      format.html # foo/bar.html.erb
      format.js   # foo/bar.js.erb
    end
  end
end

Шаблоны для его поддержки:

# app/views/layouts/foo.html.erb:
<html>...<%= yield %>...</html>

# app/views/layouts/foo.json.erb:
<%= yield %>

И шаблон AJAX, в котором я хочу визуализировать частичное:

# app/views/foo/bar.js.erb:
dojo.byID('some_div').innerHTML = "<%= escape_javascript(render(:partial => 'some/partial')) %>";

Если в шаблоне JS просто старый JS (например, alert('hi');), он использует мой шаблон JS. Когда я вставляю рендер (: частичный), он заставляет весь ответ использовать шаблон HTML, что означает, что он больше не является допустимым JS.

Возможное решение - использовать функцию для макета:

class FooController < ApplicationController
  layout :choose_layout
  ...
  private
  def choose_layout
    return nil if request.xhr?
    'foo'
  end
end

Но моя версия должна работать! Почему не так?

Ответы [ 2 ]

7 голосов
/ 19 ноября 2008

Самый последний Railscast охватывает эту тему (с использованием jQuery) .

Я не совсем понимаю, где вы можете ошибаться, но вот фрагмент из Railscast, который прекрасно работает для рендеринга части:

// views/reviews/create.js.erb
$("#new_review").before('<div id="flash_notice"><%= escape_javascript(flash.delete(:notice)) %></div>');
$("#reviews_count").html("<%= pluralize(@review.product.reviews.count, 'Review') %>");
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
$("#new_review")[0].reset();

Где вы храните свой Javascript? У вас есть Application.js, в котором вы храните вещи? Если да, включаете ли вы «dojo» перед «application» в свой javascript_include_tag?

1 голос
/ 22 февраля 2009

Попробуйте следующее;

class FooController < ApplicationController
  layout 'foo'
  def bar
    respond_to do |format|
      format.html
      format.js { render :layout => false }
    end
  end
end

Надеюсь, это поможет.

J.K.

...