Как включить HTML в ответ JS Rails?
У меня есть 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. Однако, когда я помещаю в render (: partial), он делает весь ответ использующим HTML-шаблон, что означает, что он больше не действителен JS.
Возможным решением является использование функции для макета:
class FooController < ApplicationController
layout :choose_layout
...
private
def choose_layout
return nil if request.xhr?
'foo'
end
end
Но моя версия должна работать! Почему это не так?
Ответы
Ответ 1
Последний 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" перед "приложением" в свой javascript_include_tag?
Ответ 2
Попробуйте следующее:
class FooController < ApplicationController
layout 'foo'
def bar
respond_to do |format|
format.html
format.js { render :layout => false }
end
end
end
Надеюсь, что это поможет.
J.K.