即使我在控制器中完成了redirect_to,模板也会丢失错误

时间:2013-07-09 06:59:15

标签: ruby-on-rails

我刚从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

我确实查看了与我的问题类似的thisthis帖子。但我无法弄清楚需要做些什么。

感谢您解决此问题的任何帮助。

编辑: - 在redirect_to周围添加了{} - 添加了#rake路线&#39;输出

2 个答案:

答案 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