我刚从Agile Web Development with Rails开始学习Ruby on Rails。
做一个购物车应用程序,并在实施"空车"特征。
<%= button_to 'Empty cart', @cart, method: :delete,
data: { confirm: 'Are you sure?' } %>
点击“空购物车”&#39;按钮调用购物车控制器中的销毁操作
# DELETE /carts/1
# DELETE /carts/1.json
def destroy
@cart = current_cart
@cart.destroy
@session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to store_url, notice: 'Your cart is currently empty' }
format.json { head :no_content }
end
end
在这里,我将其重定向到store_url,但它给了我一个错误。
缺少模板 缺少模板推车/销毁,应用/销毁{:locale =&gt; [:en],:formats =&gt; [:html] ,:handlers =&gt; [:erb,:builder,:raw,:ruby,: jbuilder,:coffee]}。搜索:*&#34; / Users / anil20787 / workspace / railsdir / depot / app / views&#34;
以下是佣金路线
的输出 Prefix Verb URI Pattern Controller#Action
line_items GET /line_items(.:format) line_items#index
POST /line_items(.:format) line_items#create
new_line_item GET /line_items/new(.:format) line_items#new
edit_line_item GET /line_items/:id/edit(.:format) line_items#edit
line_item GET /line_items/:id(.:format) line_items#show
PATCH /line_items/:id(.:format) line_items#update
PUT /line_items/:id(.:format) line_items#update
DELETE /line_items/:id(.:format) line_items#destroy
carts GET /carts(.:format) carts#index
POST /carts(.:format) carts#create
new_cart GET /carts/new(.:format) carts#new
edit_cart GET /carts/:id/edit(.:format) carts#edit
cart GET /carts/:id(.:format) carts#show
PATCH /carts/:id(.:format) carts#update
PUT /carts/:id(.:format) carts#update
DELETE /carts/:id(.:format) carts#destroy
store_index GET /store/index(.:format) store#index
products GET /products(.:format) products#index
POST /products(.:format) products#create
new_product GET /products/new(.:format) products#new
edit_product GET /products/:id/edit(.:format) products#edit
product GET /products/:id(.:format) products#show
PATCH /products/:id(.:format) products#update
PUT /products/:id(.:format) products#update
DELETE /products/:id(.:format) products#destroy
store GET / store#index
我确实查看了与我的问题类似的this和this帖子。但我无法弄清楚需要做些什么。
感谢您解决此问题的任何帮助。
编辑: - 在redirect_to周围添加了{} - 添加了#rake路线&#39;输出
答案 0 :(得分:3)
确定。我在理解工作时犯了一个错误,并在遵循教程书时忽略了一些细节。下面是我的CartsController(部分)和错误原因
class CartsController < ApplicationController
before_action :set_cart, only: [:show, :edit, :update, :destroy]
..
# DELETE /carts/1
# DELETE /carts/1.json
def destroy
@cart = current_cart
@cart.destroy
@session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to store_url, notice: 'Your cart is currently empty' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_cart
begin
@cart = Cart.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error "Attempt to access invalid cart #{params[:id]}"
redirect_to store_url, notice: 'Invalid cart'
else
respond_to do |format|
format.html # show.html.erb
format.json { render json: @cart }
end
end
end
# Never trust parameters from the scary internet, only allow the white list through.
def cart_params
params[:cart]
end
end
为什么会出现问题:
辅助方法“set_cart”不应在成功时自行发回响应。如果它发送响应,则根本不执行动作动作。所以它应该只是尝试获取当前购物车并将其保存在@cart实例变量中。我的set_cart方法实际上尝试发回一个响应。正是这种响应尝试引发了错误。
我的控制器有一个过滤器,它在销毁之前调用'set_cart'。“set_cart”方法尝试发回一个HTML响应,并在课程中搜索一个不存在的destroy.html.erb视图并导致缺少视图异常。
答案 1 :(得分:0)
尝试使用以下语法:
class CartsController < ApplicationController
respond_to :html, :json
def destroy
@cart = current_cart
@cart.destroy
@session[:cart_id] = nil
flash[:notice] = "Your cart is currently empty"
respond_with @cart
end
end