添加新页面到 Rails 4 应用程序

Adding new page into Rails 4 Application

我有一个新的 Rails 项目,在项目中我有一个名为 Customer 的控制器、视图和模型。现在,我需要的是,除了 CRUD 操作之外,我还需要添加两个新页面,例如:

1. http://0.0.0.0:3000/Customer/sale

2. http://0.0.0.0:3000/Customer/lease

我想在这些文件中插入代码。 我该如何实现我的意思是创建新的 salelease 链接?

在您的 routes.rb 文件中,您可以添加这两条路线:

  resources :customers do
    collection do
      get 'create_sale' => 'customers#create_sale', as: :create_sale
      get 'create_lease' => 'customers#create_lease', as: :create_lease
    end
  end

然后,您可以在 customers_controller.rb 文件中添加两个新方法(操作):

  def create_sale
    # your logic goes here
  end

  def create_lease
    # your logic goes here
  end

并在 app/views/customers/ 目录中为它们创建两个视图,如 create_sale.html.erbcreate_lease.html.erb,您将在其中放置与视图相关的代码。

我认为最好使用资源

只是一个例子,因为我不知道你是如何决定销售和租赁客户的

路线:

resources :customers

并给 index route 一个参数来获取所有 salelease customers like

客户控制员

def index
  customer_type = params[:customer_type] || ['sale','lease']
  @customers = Customer.where(customer_type: customer_type)
end

并在您的视图中使用它

customers_path(customer_type: 'sale')
#config/routes.rb
resources :customers do
   %w(sale lease).each do |route|
      get route.to_sym, action: route.to_sym, as: route.to_sym
   end
end

这将使您能够调用以下控制器操作:

#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
    def sale
    end

    def lease
    end
end

嵌套资源

顺便说一句,有些事情你应该考虑。

I mean creating new sale and lease

如果您想为您的 Customer 创建新的销售或租赁,您最好查看 nested resources

你必须记住 Rails 是面向对象的。控制器旨在让您能够 CRUD 特定对象 - IE 创建、编辑、更新、销毁等

--

我看到很多人问他们如何 "add" 控制器方法。这不是问题。但是,当您尝试将 create 方法包含在它们 所属的范围内时,问题就出现了。

您需要使您的应用程序尽可能模块化。因此,您需要能够将任何功能扩展到正确的位置:

#config/routes.rb
resources :customers do
    resources :leases, controller: :purchases, {type: :lease}
    resources :sales, controller: :purchases, {type: :sale}
end

#app/controllers/purchases_controller.rb
class PurchasesController < ApplicationController
   def new
      @customer = Customer.find params[:customer_id]
      @purchase = @customer.purchases.new(type: params[:type])
   end
   def create
      @customer = Customer.find params[:customer_id]
      @purchase = @customer.purchases.new purchase_params
   end

   private

   def purchase_params
      params.require(:purchase).permit(:type, :customer_id :etc, :etc)
   end
end

#app/models/purchase.rb
class Purchase < ActiveRecord::Base
   belongs_to :customer
end

#app/models/customer.rb
class Customer < ActiveRecord::Base
   has_many :purchases
end

如果您真的很喜欢冒险,您可以使用 STI (Single Table Inheritance)SaleLease 创建相同 class 类型的不同实例:

#app/models/sale.rb
class Sale < Purchase
end

#app/models/lease.rb
class Lease < Purchase
end

如果你愿意,我可以解释更多。