当我想要更新我的模型(型号名称购物车)时,我得到了这个奇怪的错误。 错误:操作'更新'找不到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 %>
输入名称或编号后(例如),然后单击更新按钮或其他内容,它不会将任何数据上传到模型购物车(具有正确的列)。
谢谢, 迈克尔
答案 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;仔细检查。