添加新页面到 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
我想在这些文件中插入代码。
我该如何实现我的意思是创建新的 sale
和 lease
链接?
在您的 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.erb
和 create_lease.html.erb
,您将在其中放置与视图相关的代码。
我认为最好使用资源
只是一个例子,因为我不知道你是如何决定销售和租赁客户的
路线:
resources :customers
并给 index route
一个参数来获取所有 sale
和 lease 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) 为 Sale
和 Lease
创建相同 class 类型的不同实例:
#app/models/sale.rb
class Sale < Purchase
end
#app/models/lease.rb
class Lease < Purchase
end
如果你愿意,我可以解释更多。
我有一个新的 Rails 项目,在项目中我有一个名为 Customer
的控制器、视图和模型。现在,我需要的是,除了 CRUD
操作之外,我还需要添加两个新页面,例如:
1. http://0.0.0.0:3000/Customer/sale
2. http://0.0.0.0:3000/Customer/lease
我想在这些文件中插入代码。
我该如何实现我的意思是创建新的 sale
和 lease
链接?
在您的 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.erb
和 create_lease.html.erb
,您将在其中放置与视图相关的代码。
我认为最好使用资源
只是一个例子,因为我不知道你是如何决定销售和租赁客户的
路线:
resources :customers
并给 index route
一个参数来获取所有 sale
和 lease 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
andlease
如果您想为您的 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) 为 Sale
和 Lease
创建相同 class 类型的不同实例:
#app/models/sale.rb
class Sale < Purchase
end
#app/models/lease.rb
class Lease < Purchase
end
如果你愿意,我可以解释更多。