我正在关注《用Rails 5.1进行敏捷Web开发》一书。有关使用Ajax的部分,以获取“购物车”模型进行更新而无需重新加载页面。
这里是控制器app/controllers/line_items_controller.rb
:
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product)
session[:counter] = 0
respond_to do |format|
if @line_item.save
format.html { redirect_to store_index_url }
format.js { @current_item = @line_item }
format.json { render :show, status: :created, location: @line_item }
else
format.html { render :new }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
这本书说上述功能中的respond_to
函数将导致create.js.coffee
模板被执行。
这里是app/views/line_items/create.js.coffee
:
cart = document.getElementById("cart")
cart.innerHTML = "<%= j render(@cart) %>"
最后,将商品添加到购物车的按钮是这样定义的:
<%= button_to 'Add to Cart', line_items_path(product_id: product), remote: true %>
这本书说remote: true
部分将导致页面无法重新加载。
使用名为create.js.coffee
的文件,购物车根本不会像应有的那样更新。但是,当我将文件重命名为create.js.erb
时,我确实看到购物车异步刷新而无需重新加载页面。有什么作用?
文件名为create.js.coffee
时收到的日志消息是No template found for LineItemsController#create, rendering head :no_content
。
当文件名为create.js.erb
时,我看到已找到并渲染了模板。
答案 0 :(得分:0)
我需要添加coffee-rails
宝石。我不确定为什么我还没有这个-我正在使用Rails 6.0.1。