模型不会在提交时更新

时间:2014-04-13 13:28:16

标签: ruby-on-rails ruby ruby-on-rails-4

当我想要更新我的模型(型号名称购物车)时,我得到了这个奇怪的错误。 错误:操作'更新'找不到CartsController

这是我的carts_controller.rb

class CartsController < ApplicationController
    include CartForcable
    before_action :scoped_cart, only: [:show, :update]

    def show
    end

    private

    def scoped_cart
        force_cart! lambda {|r| r.includes(:entries => {:sign => [:dimensions, :substrates]})}
    end


def update
        @cart = @cart.find(params[:id])
        if @cart.update_attributes(cart_params)
            flash[:notice] = translate 'flash.notice'
        else
            flash[:error] = translate 'flash.error'
        end
        support_ajax_flashes!
        respond_to do |format|
            format.html # renders view
            format.json { render json: @entry }
        end
    end
end

这些是我的routes.rb

resources :categories, only: [:index] do
            resources :signs, shallow: true, only: [:index]
        end

        resources :carts, only: [:show, :update]#, param: :cart_permalink

        resource :cart, as: :user_cart, only: [:show, :update], param: :cart_permalink do
            resources :cart_entries, only: [:index, :create, :update, :destroy], as: 'entries', path: 'entries'
        end
        resource :user, only: [:edit, :show, :update], as: 'current_user', path: 'profile'

        resources :signs, only: [:show]

        resources :pages, only: [:show], param: :permalink

我的show.html.erb有这种形式:

<%= form_for @cart, :url => {:controller => "carts", :action => "update" } do |f| %>
            <%= f.label :name %>
            <%= f.text_field :name %>
            <%= f.label :email %>
            <%= f.text_field :email %>
            <%= f.label :regnum %>
            <%= f.text_field :regnum %></br>

        <%= button_to "Order/update", {:controller => "carts",:action =>
        'update', :id => @cart.id }, :method => :update %>
        <% end %>

输入名称或编号后(例如),然后单击更新按钮或其他内容,它不会将任何数据上传到模型购物车(具有正确的列)。

谢谢, 迈克尔

2 个答案:

答案 0 :(得分:2)

您的update方法是私有的;控制器动作需要公开。移动

def update
  @cart = Cart.find(params[:id])
  ...
end

高于

private

线。您需要在Cart模型上进行查找,而不是@cart实例。

您可以使用show动作,尽管edit更加标准,并且适合RESTful路由,而无需覆盖约定。 Rails路由指南应该在这里提供帮助:http://guides.rubyonrails.org/routing.html

此外,您需要在编辑操作中定义@cart的值:

def edit
  @cart = Cart.find(params[:id])
end

这将确保它在编辑表单上有一个值,因此通过参数返回到更新操作。

因此,如果您尝试使用类似/carts/12345/edit(其中12345是您要更新的购物车的ID)的购物车进行编辑,则应将它们全部挂在一起。

答案 1 :(得分:1)

这看起来不对:

@cart = @cart.find...
你的意思是......?:

@cart = Cart.find...

似乎你正在使用&#34; cart_permalink&#34;而不是&#34; id&#34;在你的路线上

resource :cart, as: :user_cart, only: [:show, :update], param: :cart_permalink do

检查服务器日志并查看包含该ID的参数的名称,同时运行&#34;捆绑exec rake路由&#34;仔细检查。