I have an application that stores products (reads them from a file, no user input from html is given). The thing is that the product will have a sender. a sender can be one or many people that are interested on that product. Now on the index page of my products I have the 2 basic actions, ‘Show/Edit/Destroy’. I would like to add one more action ‘Add Sender’ that adds a sender to the specific product. I understand the logic behind it, the problem I have is the syntax because I am new to rails.
My Product Model:
class Product < ActiveRecord::Base
attr_accessible :name, :price
#relationships !
has_many :senders, dependent: :destroy #also destroys the senders when product deleted!
end
My Sender Model
class Sender < ActiveRecord::Base
attr_accessible :application_id, :email, :name
belongs_to :product
end
I also have this migration to indicate to rails the relationship
class CreateSenders < ActiveRecord::Migration
def change
create_table :senders do |t|
t.integer :product_id
t.string :name
t.text :email
t.timestamps
end
add_index :senders, [:product_id, :created_at]
end
end
Now I am thinking of creating a custom route that, ‘lies’ behind the ‘Add Sender’ link, and takes the id of the ‘current’ product. then I create a sender somehow like this
product.sender.create/add(user_id??)
Any help/guidance please?
Are you using restful routing and if so have you looked into using nested resources? If you’re not using restful routing, I would definitely take a look at it as this is exactly like what you’re looking for here. Everything below assumes you’re using the restful routing method, as it is the Rails default and fits perfectly with your use case.
The nested resources option of rails routing allows you to add a set of restful routes under an existing set of routes, where the new set of routes pertains to a resource that belongs to the parent resource.
In this case, the sender would be your nested resource and by setting this up in your routes you can create a separate senders controller (just as you did your products controller) to manage their creation/deletion/etc. The only difference from a simple CRUD controller is that in your senders controller you may have to load in the product as well as the sender (if you need access to the product, for instance if you’re doing validation on it). The product can be loaded from the ID in the routes (this is all covered in the links above).
If you only need a couple of the restful routes (create/delete but not index/show), you can control that as well (more info here):