我有新的Rails项目,在项目中我有一个名为Customer
的控制器,视图和模型。现在,我需要的是在CRUD
动作旁边我需要添加两个新页面,如:
1. http://0.0.0.0:3000/Customer/sale
2. http://0.0.0.0:3000/Customer/lease
我想在这些文件中插入代码。
我如何实现这一点,我的意思是创建新的sale
和lease
链接?
答案 0 :(得分:6)
在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
创建两个视图,您可以在其中放置与视图相关的代码。
答案 1 :(得分:2)
#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
嵌套资源
顺便说一下,你应该考虑一些事情。
我的意思是创建新的
sale
和lease
如果您想为Customer
创建新的销售或租约,您可能会更好地关注nested resources。
你必须记住Rails是面向对象的。控制器旨在让您能够CRUD
特定对象 - IE创建,编辑,更新,销毁等。
-
我看到很多人都在问他们如何能够&#34;添加&#34;控制器的方法。这不是问题。但是,当您尝试将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
创建相同班级类型的不同实例:
#app/models/sale.rb
class Sale < Purchase
end
#app/models/lease.rb
class Lease < Purchase
end
如果你愿意,我可以解释一下这个。
答案 2 :(得分:1)
我认为最好使用资源
只是一个例子,因为我不知道你如何决定销售和租赁客户
路线:
resources :customers
并为index route
提供一个参数以获取所有sale
和lease customers
customercontroller
def index
customer_type = params[:customer_type] || ['sale','lease']
@customers = Customer.where(customer_type: customer_type)
end
并在您的观看中使用此
customers_path(customer_type: 'sale')