Rails 3.2.2不执行rjs

我正在阅读使用Rails第4版的实用敏捷Web开发这本书,但我正在使用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中的create动作:

 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)) 

但是,当我单击启动此操作的按钮时:

  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) 

但是在视图中没有任何事情发生….甚至没有警报。 我错过了什么? file.js.erb和file.js.rjs有什么区别?

看起来rjs已被删除为 Rails 3.1 的默认值 。 你可以通过安装prototype-rails gem来恢复它,但我认为你应该只使用jQuery,这是新的默认值。

至于你的代码,它不起作用的原因是它是一个被解释为.js.erbrjs模板,这很可能只会产生无效的JavaScript(你应该在浏览器的JavaScript控制台中看到错误)。 用于为您设置page变量的rjs模板,您可以使用它编写Ruby代码来操作页面。 在.js.erb模板中,它更像您的.html.erb视图。 您编写实际的JavaScript,使用<% %>标记嵌入Ruby。 所以create.js.erb的代码应该如下所示:

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

在rails> = 3.1中,不再有jquery-rjs。 但是你可以在这里使用CoffeeScript: line_items/create.js.coffee

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

或类似的东西。