Rails 3.2.2 не выполняет rjs

Я следую книге Pragmatic Agile Web Development With Rails 4th Edition, НО я использую Rails 3.2.2 вместо 3.0.5, как рекомендовано в книге:

~$ ruby -v
ruby 1.9.3p125 (2012-02-16) [i686-linux]
~$ rails -v
Rails 3.2.2

Я застрял при включении AJAX для перерисовки корзины без перезагрузки страницы. Вот действие создания в line_items_controller.rb:

def create
    @cart = current_cart
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to(store_url) }
        format.js 
        format.json { render json: @line_item, status: :created, location: @line_item }
      else
        format.html { render action: "new" }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

А вот мой файл RJS create.js.rjs (в app/views/line_items):

page.alert('NO PROBLEM HERE')
page.replace_html('cart', render(@cart))

Однако, когда я нажимаю кнопку, которая запускает это действие:

<%= button_to 'Add to Cart', line_items_path(:product_id => product), :remote => true %>

Я получаю следующую ошибку в журнале разработки:

ActionView::MissingTemplate (Missing template line_items/create, application/create with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
  * "/home/me/src_rails/depot/app/views"
):
  app/controllers/line_items_controller.rb:47:in `create'

Если я изменю имя файла create.js.rjs на create.js.erb, проблема будет устранена:

Rendered line_items/create.js.erb (0.4ms)

но в представлении ничего не происходит.... даже оповещения. Что мне не хватает? В чем разница между файлом.js.erb и файлом.js.rjs?


person Daniel Estrada    schedule 13.04.2012    source источник
comment
Эй, парень! Я нашел твой пост в гугле. Я столкнулся с такой же ситуацией. Вы нашли решение?   -  person code4j    schedule 01.09.2012
comment
Я исправил проблему!!! См. мой решение. Я надеюсь это тебе поможет.   -  person code4j    schedule 01.09.2012


Ответы (2)


Похоже, что rjs был удален по умолчанию с Рельсы 3.1. Вы можете вернуть его, установив гем prototype-rails, но я думаю, что вам следует просто использовать jQuery, который является новым значением по умолчанию.

Что касается вашего кода, причина, по которой он не работает, заключается в том, что это шаблон rjs, который интерпретируется как .js.erb, и это, вероятно, просто создает недопустимый JavaScript (вы должны увидеть ошибки в консоли JavaScript в вашем браузере). Шаблон rjs используется для установки переменной page для вас, и вы должны написать код Ruby, используя его для управления вашей страницей. В шаблоне .js.erb это работает больше, чем в ваших представлениях .html.erb. Вы пишете на самом деле JavaScript со встроенным Ruby, используя теги <% %>. Таким образом, код в create.js.erb должен выглядеть примерно так:

 alert('NO PROBLEM HERE');
 $('#cart').html("<%= escape_javascript(render(@cart)) %>");
person tsherif    schedule 14.04.2012
comment
Спасибо, тогда я обязательно перейду на jquery. - person Daniel Estrada; 16.04.2012

В rails >= 3.1 больше нет jquery-rjs. Но вы можете использовать CoffeeScript здесь: line_items/create.js.coffee:

alert 'NO PROBLEM HERE'
$('#cart').html '<%= j render(@cart) %>'

или что-то вроде того.

person Vasiliy Ermolovich    schedule 13.04.2012