Rails button_to没有路由匹配{:action =>“complete”,:controller =>“dashboard”,:name =>“Order”}

请帮助我尽我所能。 我真的需要你的帮助。

因此,我试图使标记顺序完整。 现在一切都可以通过按钮将订单标记为完成。 我运行了迁移添加。

class AddCompleteToOrder < ActiveRecord::Migration def change add_column :orders, :complete, :boolean, default: false end end 

然后我添加了一个方法order.rb

 def complete! update(complete: true) end 

然后routes.rb

 resources :orders do post "complete", to: "orders#complete", on: :member end 

然后这是按钮

 = button_to "Mark as complete", { action: "complete", id: @order.id } 

但是我没有@ order.id但订单确实有@ order.name所以我把它改成了

 = button_to "Mark as complete", { action: "complete", name: @order.name } 

但后来我得到了错误:

Dashboard中的ActionController :: UrlGenerationError #dadmin显示/Users/jacksharville/Desktop/dancer/app/views/dashboard/dadmin.html.haml,其中第87行引发:

没有路由匹配{:action =>“complete”,:controller =>“dashboard”,:name =>“Order”}

提取的来源(第87行):85 86 87

 = link_to "Back to Dashboard", :back, :class => 'btn-danger btn' = button_to "Mark as complete", { action: "complete", name: @order.name } 

所以很明显我正在做routes.rb错误,但我无法解决它。 请帮忙。 任何帮助非常感谢。

routes.rb(完整档案)

 Rails.application.routes.draw do mount RailsAdmin::Engine => '/admin', as: 'rails_admin' get 'home/index' root 'home#index' #pages get '/why' => 'pages#why' get '/trak' => 'pages#trak' get '/contact' => 'pages#contact' get '/mydms' => 'pages#mydms' get '/air' => 'pages#air' get '/ocean' => 'pages#ocean' get '/road' => 'pages#road' get '/courier' => 'pages#courier' get 'fulfilment' => 'pages#fulfilment' get 'express' => 'pages#express' resources :dashboard get 'dadmin' => 'dashboard#dadmin' get 'myorders' => 'dashboard#myorders' get 'label' => 'dashboard#label' resources "contacts", only: [:new, :create] devise_for :users as :user do get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration' put 'users' => 'devise/registrations#update', :as => 'user_registration' end resources "orders" get "/confirm" => "confirmations#show" get 'dconfirmation' => 'orders#confirmation' resources :orders do post "complete", to: "orders#complete", on: :member end end 

orders_controller.rb

 class OrdersController < ApplicationController before_filter :authenticate_user! def new @order = Order.new end def create @order = current_user.orders.new(order_params) @order.email = current_user.email @order.name = current_user.name @order.address_line_1 = current_user.address_line_1 @order.address_line_2 = current_user.address_line_2 @order.postcode = current_user.postcode @order.city = current_user.city @order.country = current_user.country if @order.save redirect_to dconfirmation_path end end def order_params params.require(:order). permit( :email, :delivery_name, :company_name, :delivery_address1, :delivery_address2, :delivery_address3, :delivery_city, :delivery_postcode, :delivery_country, :phone, :package_contents, :description_content, :restricted_items, :terms_conditions, :insurance, :contents_value, :cf_reference, :reference_number ) end def show @user = User.find(params[:id]) end def confirmation end def complete! order = Order.find(params[:id]) order.complete! # handle response end end 

dashboard_controller.rb

 class DashboardController < ApplicationController before_filter :authenticate_user! def index end def admindashboard (current_user.nil?) ? redirect_to(root_path) : (redirect_to(root_path) unless current_user.admin?) end def adminuser (current_user.nil?) ? redirect_to(root_path) : (redirect_to(root_path) unless current_user.admin?) end def dadmin (current_user.nil?) ? redirect_to(root_path) : (redirect_to(root_path) unless current_user.admin?) # @order = Order.all @order = Order.order("name").page(params[:page]).per(1) end def myorders @order = current_user.orders.order("name").page(params[:page]).per(1) end def show @user = User.find(params[:id]) end def label @order = current_user.orders.order("name").page(params[:page]).per(1) end def complete! order = Order.find(params[:id]) order.complete! # handle response end end 

您可以在button_to标记中指定此附加选项:controller => "order" ,但使用button_to标记的正确方法是不为选项创建单独的哈希。 而是将它用作button_to("Mark as complete", controller: "order", action: "complete", name: @order.name)

试试这个

  button_to "Mark as complete", { controller: "orders", action: "complete", name: @order.name }, {method: :post} 

此链接可以提供帮助: 路由错误 – 使用button_to和自定义操作时没有路由匹配

耙路给我:

 complete_order POST /order/:id/complete(.:format) orders#complete 

您需要将complete操作从DashboardsController移动到OrdersController ,这是在routes文件中定义的位置。

此外,您可以使用:

 = button_to "Mark as complete", complete_order_path(@order) 

控制器动作正在寻找params[:order_id]因此它可以找到正确的顺序。 我不确定您的视图中是如何定义订单的,但您需要将订单对象传递给路径。

如果您在Order类中定义了一个to_param方法,它定义了order的名称而不是id作为params,那么您需要更新complete动作以按名称查找订单。

但我的猜测是它是默认id 。 所以将订单对象传递给路径应该有效。