Можно ли отобразить js.erb в ответ на запрос AJAX без использования метода respond_to?

Я спрашиваю по нескольким причинам:

  1. Я буду выполнять только AJAX-вызовы своих контроллеров;
  2. Я не буду поддерживать какие-либо другие типы контента (например,: html,: xml и т. Д.); а также
  3. Я хочу иметь возможность визуализировать другой файл js.erb, а не тот, который назван так же, как метод контроллера (т. Е. different.js.erb)

Вот код в качестве примера.

app / views / posts / awesome.js.erb:

alert("WOOHOO");

PostsController # create

def create
  @post = Post.new(params[:task])
  if @post.save 
    render :partial => 'awesome.js.erb'
  end
end

Когда метод create вызывается через AJAX, Rails жалуется на частичное отсутствие:

ActionView::MissingTemplate (Missing partial post/awesome.js, application/awesome.js with {:handlers=>[:erb, :builder, :coffee, :haml], :formats=>[:js, "application/ecmascript", "application/x-ecmascript", :html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json], :locale=>[:en, :en]}. Searched in:
3
John 29 Авг 2011 в 08:44

2 ответа

Лучший ответ

Частичные файлы должны быть названы с подчеркиванием.

Попробуйте переименовать партиал в app/views/posts/_awesome.js.erb

3
Kleber S. 29 Авг 2011 в 05:06

Хотя ответ Кибера С. верен, вот еще один метод, который, я думаю, будет ценным для тех, кто хочет поддержать «традиционный» метод создания файлов js.erb.

Вместо использования render :partial используйте render :template. Однако здесь есть предостережение: путь поиска для шаблона не ограничивается автоматически именем контроллера (т. Е. app/views/posts). Вместо этого Rails начинается с app/views/. Итак, чтобы сослаться на «шаблон», вам нужно добавить подпапку, в которую вы хотите заглянуть, если она не находится в корне. В моем случае мне пришлось добавить posts.

def create
  @post = Post.new(params[:task])
  if @post.save 
    # using :template and added 'posts/' to path
    render :template => 'posts/awesome.js.erb'
  end
end

Преимущество здесь в том, что если вы захотите использовать метод respond_to и следовать соглашению, вам не нужно будет переименовывать свой js.erb, удаляя подчеркивание.

5
John 29 Авг 2011 в 14:18