我需要一种方法来将我制作的方法应用于我选择的订单。或者找到另一种方法来标记完成的东西。
这是我到目前为止尝试过的。但我不介意尝试一些全新的东西。 所以我在视图中显示了这些订单,如下所示:
.col-md-12
.admindash
%h1 Admin Dashboard
.text-norm
Welcome to the admin dashboard here you can see incoming and outgoing orders.
.row
.col-md-8
- for order in @order
%h2
= order.user.name
.orderpanel
.clientarea
Client name:
= order.user.name
%br
Client email:
= order.user.email
%br
Client address ... -->:
%br
= order.user.address_line_1
%br
= order.user.address_line_2
%br
= order.user.postcode
%br
= order.user.city
%br
= order.user.country
.delivarea
%br
delivery_name:
= order.delivery_name
%br
company_name:
= order.company_name
%br
delivery_address1:
= order.delivery_address1
%br
delivery_address2:
= order.delivery_address2
%br
delivery_address3:
= order.delivery_address3
%br
delivery_city:
= order.delivery_city
%br
delivery_postcode:
= order.delivery_postcode
%br
phone:
= order.phone
%br
package_contents:
= order.package_contents
%br
description_content:
= order.description_content
%br
contents_value:
= order.contents_value
%br
cf_reference:
= order.id
CR
%br
reference_number:
= order.reference_number
.tac
restricted_items:
= order.restricted_items
%br
terms_conditions:
= order.terms_conditions
%br
insurance:
= order.insurance
= order.id
.col-md-4.sidebar
= paginate @order
= link_to "Data Control", rails_admin_path, :class => 'btn-danger btn'
%p
= link_to "Back to Dashboard", :back, :class => 'btn-danger btn'
我想在页面上添加一个按钮,以便我可以将订单标记为完成,或者制作一个包含所有订单的表格和一个标记为完成的按钮。
所以我运行了一个迁移来添加
complete
的布尔类。
class AddCompleteToOrder < ActiveRecord::Migration
def change
add_column :orders, :complete, :boolean, default: false
end
end
然后在我做的命令控制器中:
def complete
order = Order.find(params[:order_id])
order.complete!
# handle response
end
order.rb
class Order < ActiveRecord::Base
belongs_to :user
def complete!
update(complete: true)
end
end
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'
end
所以我现在需要一些方法来更新特定订单。喜欢列出所有订单 @order.id 然后选择该订单以使用该方法。我不知道我在做什么,因为我是 Rails 的新手。请帮忙。我只需要表明订单现在已完成。
我不介意我如何将订单标记为完成,它只需要在页面重新加载并且我的网站确实使用 jQuery 时记住这一点。有什么方法可以做到吗?
有几个选项,但这里有一个可以让您的控制器保持安静。
首先 - 我使用日期时间而不是布尔值。
class AddCompleteToOrder < ActiveRecord::Migration
def change
add_column :orders, :completed_at, :datetime
end
end
在controller中,直接使用update方法,但是让它respond_to js
respond_to do |format|
format.html { redirect_to [:admin, @order] }
format.js { render :update }
end
创建一个 update.js.erb(或 haml)视图。看起来你正在使用 haml.
- order_list_item = render :partial => 'admin/orders/order', :locals => { :order => @order }
$("##{dom_id(order)}").replaceWith('#{j(order_list_item)}')
您可以部分重复使用您的订单。
在订单部分,添加一个按钮或链接。我想你也可以使用 button_to 代替。
= link_to "Completed", admin_order_path(order, 'order[completed]' => true), :remote => true, :method => :put
记得将 dom_id 添加到您的 _order.html.haml 部分。 Haml 为您提供了一种方便的方式来做到这一点。
将它移到它自己的部分,所以而不是
- for order in @order
你会有
# /admin/orders/_order.html.haml
%div[order]
... All the other order code from the earlier for loop
然后这样称呼它
= render @orders # Change your instance variable name to "@orders" to match rails conventions
模型中,handle completed和completed=
class Order < ActiveRecord::Base
def completed
!completed_at.nil?
end
def completed=(state=false)
completed_at = Time.now if state
end
end
如果您一开始没有看到页面更新,请检查开发人员工具(在 chrome 或 safari 中)响应输出。您可以在响应正文中以这种方式查看错误。
在 orders_controller.rb
def completed_orders
# Get order from DB
@order = Order.find(params[:id])
if [email protected]?
if @order.completed!
flash[:notice] = "Your order has been marked complete. Email notification will be sent!"
# Can also do more stuff here.
else
flash[:alert] = "Something is hmmm not right..."
# Can also do more stuff here.
end
end
redirect_to request.referrer
end
在 Order 模型 order.rb 中,您可以枚举,将状态列作为整数添加到订单表中。下面你从 0 到 1 枚举 这样你可以简单地知道状态栏中的 0 是“正在处理”,1 将是“已完成”。您还可以在 orders.rb 的枚举中添加更多。您也可以改为使用布尔值,例如 0 为 false,1 为 true,但这仅限于两个。因此,您最好将状态列作为整数并枚举,并且您可以添加更多类似“processing、under_investigation、other_issues、completed”的内容。下面只是两种状态。
belongs_to :user, required: false
enum status: [:processing, :completed]
确保在执行 completed_orders 操作后更新路线。也许您必须重新迁移或更新您的数据库等