我正在阅读《 使用Rails进行实用敏捷的Web开发》第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有什么区别?
从Rails 3.1 rjs开始,它似乎已被删除为默认值。您可以通过安装prototype-railsgem 来找回它,但是我认为您应该只使用jQuery,这是新的默认设置。
rjs
prototype-rails
对于您的代码,它不起作用的原因是它是一个rjs模板,被解释为.js.erb,这很可能会产生无效的JavaScript(您应该在浏览器的JavaScript控制台中看到错误)。rjs用于page为您设置变量的模板,您将使用它来编写Ruby代码来操纵页面。在.js.erb模板中,它的工作方式更像您的.html.erb视图。您编写了实际的JavaScript,并使用<% %>标记嵌入了Ruby 。因此,其中的代码create.js.erb应如下所示:
.js.erb
page
.html.erb
<% %>
create.js.erb
alert('NO PROBLEM HERE'); $('#cart').html("<%= escape_javascript(render(@cart)) %>");