Rails 3.2.2不执行rjs

时间:2012-04-13 20:50:08

标签: javascript ruby-on-rails ruby ajax rjs

我正在关注实用的敏捷Web开发使用Rails第4版这本书,但我正在使用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)

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

2 个答案:

答案 0 :(得分:18)

从Rails 3.1开始,rjs看起来像removed as the default。您可以通过安装prototype-rails gem来获取它,但我认为您应该使用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)) %>");

答案 1 :(得分:6)

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

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

或类似的东西。