I tried following the advice in this Rails3 Routes - Passing parameter to a member route
I have:
_health.html (partial)
<%= link_to image_tag("icons/pro_gray.png", :border =>'none'), flag_contact_flags_path(#id), :action => "flag", :id => #id, :remote => true, :class => 'flag' %>
routes.rb
resources :contact_flags do
get 'flag/:id', :action => 'flag', :on => :collection
end
When I do this I get this error:
ActionView::Template::Error (undefined method `flag_contact_flags_path' for #<#:0x00000101430358>):
When I rake routes I show:
GET /contact_flags/flag/:id(.:format) {:action=>"flag", :controller=>"contact_flags"}
Why doesn't think work?
I really need to pass the :id parameter.. any ideas?
Thanks
Looks like you need to change up the route you're pointing to. Try contact_flags_path(#id) instead of flags_contact_flags(#id).
Any luck?
Related
I am facing this error while running my application:
No route matches [PUT] "/accounts/1/payment"
This is my form syntax;
<%= semantic_form_for(#account, :url => payment_path, :html => { :method => :put }) do |f| %>
......
<% end %>
routes.rb:
get "/accounts/:id/payment" => "accounts#payment", :as => "payment"
controller method:
def billing
#account = Account.find(params[:id])
if request.put?
// some code here
end
end
Replace
get "/accounts/:id/payment" => "accounts#payment", :as => "payment"
with
match "/accounts/:id/payment", to: "accounts#payment", :as => "payment", via: [:get, :put]
and let me know if this works.
EDIT
If your controller action is billing, then you may have to do
match "/accounts/:id/payment", to: "accounts#billing", :as => "payment", via: [:get, :put]
your form is trying to find a route matches method put while your route has a get method.
Use put in routes instead of get
put "/accounts/:id/payment" => "accounts#payment", :as => "payment"
In your form you are telling this form to be treated as PUT request but your routes says it is GET request. You should use same request type in both routes.rb and your form definition.
Try this
put "/accounts/:id/payment" => "accounts#billing", :as => "payment"
I have a controller for a resource, BuddiesController. My routes config file up until now has been
resources :buddies
match ':controller(/:action(/:id))', :via => [:get, :post]
I didn't realize what the ' resources :buddies ' line was doing until I read up on routing in Rails just now, because the behavior has been identical with what I expected until now. The problem was that I wanted to add a non-CRUD action to the controller: 'search'. Every time I used link_to(:action => 'search'), I would get an exception saying that action 'show' could not be found despite the url being ' localhost:3000/buddies/search ' as expected. I have several questions arising from this:
Firstly, the form I used in 'new' stopped working:
%= form_for(#buddy, {:action => :create, :method => :post, :html => {:role => "form"}}) do |f| %>
because buddies_path couldn't be found. How could I manually add a buddies_path to my routes?
Secondly, I revised the form to use:
<%= form_for(#buddy, :url => {:action => :create, :id => #buddy.id}, :html => {:role => "form", :id => #buddy.id}) do |f| %>
but this has caused the form to give me password and email confirmation not matching errors even if they match. What's going on here?
Lastly, what is the best way to add a search action to my resource?
#routes.rb
resources :buddies
collection do
get :search
end
end
now when you run rake routes | grep 'buddies' you will get output something like this :
now you need to define this search action in your buddies controller .
#buddies_controller.rb
Class BuddiesController < ApplicationController
def search
end
end
Have your search form in app/views/buddies/search.html.erb
Now in order to open your search form / to hit your search action you need to use
<%= link_to 'Search XYZ', search_buddies_path %>
against buddies#search you can see search_buddies
In routes.rb:
resources :buddies do
collection do
post :search
end
end
This might make your routing works.
My Rails route isn't working, I get this error on load:
undefined method `accept_roomidex_requests_path' for #<#<Class:0x00000103394050>:0x000001033ac920>
Here are my (relevant) file contents:
config.rb
get '/roomidex_requests/:id/accept' => 'roomidex_requests#accept', :as => :accept_roomidex_requests_path
roomidex_requests_controller.rb
def accept
# code to do stuff
end
some_view.rb
<%= link_to "Accept",
accept_roomidex_requests_path(:id),
:method => :post,
:remote => true %>
Try (without _path suffix in as option):
get '/roomidex_requests/:id/accept' => 'roomidex_requests#accept', :as => :accept_roomidex_requests
And probably you should change http verb to post.
In RoR 3, I just want to have a link/button that activates some action/method in the controller. Specifically, if I click on a 'update_specs' link on a page, it should go to 'update_specs' method in my products controller. I've found suggestions to do this on this site:
link_to "Update Specs", :controller => :products, :action => :update_specs
However, I get the following routing error when I click on this link:
Routing Error No route matches {:action=>"update_specs",
:controller=>"products"}
I've read up on routing but I don't understand why I should have to route this method if all other methods are accessible via resources:products.
You need to create a route for it.
For instance:
resources :products do
put :update_specs, :on => :collection
end
Also by default link_to will look for a GET method in your routes. If you want to handle a POST or PUT method you need to specify it by adding {:method => :post } or {:method => :put } as a parameter, like:
link_to "Update Specs", {:controller => :products, :action => :update_specs}, {:method => :put }
Or you can use button_to instead of link_to which handles the POST method by default.
I am trying to link to action addData in the entries controller. I have constructed the link like this:
<%= link_to image_tag (w.link, :border =>0) ,:controller => :entries, :action => :addData %>
but when I click on the link, I get this error:
Couldn't find Entry with ID=addData
I'm pretty sure this is because I have a restful design. Is there a way around this problem? Thanks for reading.
Rails has migrated wholly to a RESTful design. This means that in order to use non standard actions you have to add them to your resources in config/routes.rb.
If they operate on all resources you add them to the hash :collection => {:addData => :post}
In case you have one operating on a single resource with an id use :member.
To some it up for you.
map.resources :entries, :collection => {:addData => :post}
To use the old style of mapping any action to any controller you can add the following two lines to your config/routes.rb
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'
Have you defined the route properly for this action addData?
By the way try this :
<%= link_to image_tag (w.link, :border =>0) ,{:controller => :entries, :action => :addData} %>