【问题标题】:Rails 3.2.2 not executing rjsRails 3.2.2 不执行 rjs
【发布时间】:2012-04-26 05:58:11
【问题描述】:

我正在关注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)

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

【问题讨论】:

  • 嘿家伙!我在谷歌上找到了你的帖子。我面临同样的情况。你找到解决办法了吗?
  • 我解决了这个问题!!!见我的solution。我希望这可以帮助你。

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


【解决方案1】:

从 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,并使用 &lt;% %&gt; 标签嵌入 Ruby。所以create.js.erb 中的代码应该是这样的:

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

【讨论】:

  • 谢谢,那我肯定改用jquery了。
【解决方案2】:

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

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

或类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多