Rails,如何将订单标记为已完成

问题描述 投票:0回答:2

我需要一种方法来将我制作的方法应用于我选择的订单。或者找到另一种方法来标记完成的东西。

这是我到目前为止尝试过的。但我不介意尝试一些全新的东西。 所以我在视图中显示了这些订单,如下所示:

.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 时记住这一点。有什么方法可以做到吗?

jquery ruby-on-rails ruby-on-rails-4 haml
2个回答
1
投票

有几个选项,但这里有一个可以让您的控制器保持安静。

首先 - 我使用日期时间而不是布尔值。

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 中)响应输出。您可以在响应正文中以这种方式查看错误。


0
投票

在 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 操作后更新路线。也许您必须重新迁移或更新您的数据库等

© www.soinside.com 2019 - 2024. All rights reserved.