I have new Rails project, in the project I have a controller, view and model named as Customer
. Now, what I need is that beside the CRUD
actions I need to add two new pages like:
1. http://0.0.0.0:3000/Customer/sale
2. http://0.0.0.0:3000/Customer/lease
And I want to insert code in these files.
How do I achieve this I mean creating new sale
and lease
links?
In your routes.rb
file you can add these two routes:
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
Then, you can add two new methods (actions) in your customers_controller.rb
file:
def create_sale
# your logic goes here
end
def create_lease
# your logic goes here
end
and also create two views for them in the app/views/customers/
directory as create_sale.html.erb
and create_lease.html.erb
where you will put your view related code.
#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
This will give you the ability to call the following controller actions:
#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
def sale
end
def lease
end
end
Nested Resources
As an aside, there is something you should consider.
I mean creating new
sale
andlease
If you want to create new sales or leases for your Customer
, you may be better looking into nested resources.
You must remember that Rails is object orientated. The controllers are meant to give you the ability to CRUD
specific objects - IE create, edit, update, destroy, etc.
--
I see many people asking how they can "add" methods to controllers. This is not a problem. Problem rise, however, when you're trying to include create
methods in a scope where they don't belong.
You need to keep your application as modular as possible. As such, you need to be able to extend any functionality into their correct places:
#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
If you felt really adventurous, you'd be able to use STI (Single Table Inheritance) to create different instances of the same class type for Sale
and Lease
:
#app/models/sale.rb
class Sale < Purchase
end
#app/models/lease.rb
class Lease < Purchase
end
I could explain more about this if you wanted.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With