I have a project where user can download files. Now, i want another page for show all users. so, i add a method all_users in my addfiles_controller. I have also a view page all_users.html.erb for that. But The ploblem is with the routes.rb file . Here I want to ensure user can only use :index, :new, :create, :destroy, :all_users paths.
How can i set this :only helper in my routes.rb file, like
resources :addfiles, only: [:index, :new, :create, :destroy, :all_users]
My routes.rb file::
resources :addfiles do
collection do
get 'all_users'
end
end
you shouldn't write all_users to only, because only/except related just to standard actions index, show, new, edit, create, update, destroy which resources define by default
resources :addfiles, only: [:index, :new, :create, :destroy] do
collection do
get 'all_users'
end
end
Related
I have simple controller and routes file.
In my route and controller i have created a module. I wrote a simple method which is redirecting me show. I am not sure why.
Controller
module Seller
class CampaignsController < Seller::BaseController
before_action :confirm_logged_in
def viewAllCampaigns
#campaigns = Campaign.all
end
def show
end
end
end
Routes file
scope module: 'seller' do
#namespace :power do
resources :dashboard, only: [:index]
resources :sessions, only: [:create, :destroy]
resources :campaigns, only: [:index, :create, :show, :update, :destroy]
get 'viewAllCampaigns' => 'campaigns#viewAllCampaigns'
end
Output
Started GET "/campaigns/viewAllCampaigns" for 127.0.0.1 at 2015-10-12 17:39:43 +0500
Processing by Seller::CampaignsController#show as HTML
Parameters: {"id"=>"viewAllCampaigns"}
Rendered seller/campaigns/show.html.erb (0.1ms)
I am hitting http://localhost:3000/campaigns/viewAllCampaigns in browser.
Ideally your routes should be defined like this.
resources :campaigns, only: [:index, :create, :show, :update, :destroy] do
get 'viewAllCampaigns', on: :collection
end
The first comment on the routes.rb file is The priority is based upon order of creation: first created -> highest priority. This is the reason your route is redirecting to show. Rails is treating this url as campain/:id.
Routes are tested in order, from top to bottom. The show route you've added for the campaigns resource will look for urls matching this pattern:
/campaigns/:id
/campaigns/viewAllCampaigns matches this, so it will do the show action., with params[:id] = "viewAllCampaigns"
Move the special case route up above the resources#campaigns route to fix this, then it will catch the url first.
get 'viewAllCampaigns' => 'campaigns#viewAllCampaigns'
resources :campaigns, only: [:index, :create, :show, :update, :destroy]
It takes the following get request as a show action because show expects campaigns/:id, and it assumes 'viewAllCampaigns' is an id in this instance:
/campaigns/viewAllCampaigns
Your link_to should just be pointing to the following:
'/viewAllCampaigns'
Your route structure isn't really RESTful, but that's a separate topic.
If I wish to create rails' routes with only API specific methods, i.e. index, show, create, update and destroy and DO NOT wish to create new and edit.
I can do it in the following way,
resources :aalu, except: [:new, :edit]
Or
resources :tamaatar, only: [:index, :show, :create, :update, :destroy]
Do I have to keep on repeating this except or only on every resource declaration?
Is there any other way to achieve this by specifying it only once?
You can indeed, using with_options. Like this:
with_options except: [:new, :edit] do |opt|
opt.resources :aalu
opt.resources :tamaatar
end
Let me know if that helps!
[edit]
You don't even need to pass the argument to the block in this case. So you can use:
with_options except: [:new, :edit] do
resources :aalu
resources :tamaatar
end
Which I think is a bit neater.
You can specify your included or excluded methods as:
included = {only: [:index, :show, :create, :update, :destroy]}
excluded = {except: [:new, :edit]}
And then while defining the resource, you can use it like
resources :aalu, excluded
OR
resources :aalu, included
I have this url working now on my Rails 4.2 app - https://example.org/causes/help-family What do I need to do to change the url's to look like this - https://example.org/help-family without the "causes" controller showing up in the route?
https://example.org/causes should still continue to list all the causes.
This is what part of my routes file looks like.
resources :causes, only: [:new, :create, :index, :show] do
get :thankyou
resources :donations, only: [:new, :create, :show ]
end
Thank you!
You can do:
resources :causes, path: '/', only: [:new, :create, :show] do
get :thankyou
get :index, path: 'causes', on: :collection
resources :donations, only: [:new, :create, :show ]
end
This is assuming you only want to keep the 'causes' in the path for the index page.
you can try it
get '/help-family', to: "causes#help-family"
I have a simple controller that is supposed to respond to just show and index actions. In order to tighten up my routes, I have added the condition to only handle :show and :index. The problem is that this appears to force the show action to respond to pro_infos/new, where it presumably sees 'new' as the :id param.
Not a real problem in itself, but it breaks my rspec routing test for new to not be routable.
From routes:
resources :masters, only: [:show, :index, :new, :create] do
resources :pro_infos, only: [:show, :index]
end
From rspec routing
it "routes to #new" do
expect(:get => "masters/2/pro_infos/new").not_to be_routable
end
rake routes |grep pro_infos returns:
master_pro_infos GET /masters/:master_id/pro_infos(.:format) pro_infos#index
master_pro_info GET /masters/:master_id/pro_infos/:id(.:format) pro_infos#show
I understand that I can just cut out the routing test for the new action, but for the sake of consistency across my application I would prefer to test for the routing not responding to it. What is the correct / best-practice approach to this?
You could add a constraint (seen here) to your route to only allow integer IDs like this:
resources :masters, only: [:show, :index, :new, :create] do
resources :pro_infos, only: [:show, :index], constraints: { id: /\d+/ }
end
I understand resource and path routes in rails 3 but I do not know is there any way to have both routes ? I try this routes but it not work for me, this is the routes:
resources :roles, only: [:index, :create, :show, :update]
get '/roles/:id' => 'roles#available_users'
How can we routes to use both routes ?
thankyou very much
Routes
What you're asking for cannot be done, as you'll be using the same "route" for different controller actions:
#config/routes.rb
resources :roles, only: [:index, :create, :show, :update] #-> domain.com/roles/:id - roles#show
If you then create another route for domain.com/roles/:id, Rails will just take the first which it finds in the routes file
--
The way to fix your issue is likely to be down to the following:
#config/routes.rb
resources :roles, except: [:edit, :destroy] do
get :available_users # -> domain.com/roles/:id/available_users
end
This will take you to the roles#available_users action, providing you with the ability to load the view you wish (to display the users for a particular role)
For a more defined explanation, I'd recommend checking out the nested_resources part of the Rails routing system
If I understand you correctly you want something like this:
resources :roles, only: [:index, :create, :update] do
get '/roles/:id' => 'roles#available_users'
end
Correct?
Just add an "do" behind the closing ] and an end after the custom routes.
Edit: Apparently I got wrong. ;) What you could do is:
resources :roles, only: [:index, :create, :show, :update] do
get '/roles/:id/available' => 'roles#available_users'
end