I have the following form declaration :
<%= semantic_form_for #contrat_line,
:url => url_for(:controller =>"/backend/orders/#{#contrat.id}/contrat_lines",
:action =>"create") do |f| %>
I want to hit the following route :
POST /backend/orders/:order_id/contrat_lines(.:format) backend/contrat_lines#create
but i have the following error when i want to display the form (even before using it):
No route matches {:controller=>"backend/orders/23/contrat_lines", :action=>"create"}
I would say this route exist, why is it saying that it does not?
routes.rb code
match "/backend/orders/:order_id/contrat_lines" => "orders#contrat_lines", :as => "contrat_lines"
then, view code
<%= semantic_form_for #contrat_line,
:url => contrat_lines_url(:order_id => #contrat.id),
:action =>"create") do |f| %>
Thanks to salil i devised the following form :
backend_order_contrat_lines_url(:order_id => #contrat.id), :action =>"create" do |f| %>
And it works with thoses routes :
namespace :backend do
resources :orders do
resources :contrat_lines
end
end
Thx a lot!, if you want i can edit your answer and set it as accepted.
Related
I have a simple_form_for that triggers a custom route instead of the traditional update method and i am getting this error.
No route matches [PATCH] "/ft_update")
I don't understand where this "/" is comming from. Can anyone help me?
here is my declaration of my simple_form_for
<%= simple_form_for #time,:url=>{:action=>"ft_update", :controller=> "experiencetables"},
remote: true do |f| %>
part of my routes file looks like this
resources :experiencetables do
member do
patch :vol_update, :formats => "js"
patch :ft_update, :formats => "js"
patch :pt_update, :formats => "js"
patch :employ_update, :formats => "js"
end
end
my experiencetables_controller.rb file looks like
def ft_update
#user = current_user
#exp_vol = Experiencetable.find_by(:user_id => #user.user_id,:full_time => true)
#exp_vol.update_attributes(work_params)
respond_to do |f|
f.js
end
end
As suggested by #DaveNewton in his comment, you can directly use a path helper.
Looking at your defined routes, ft_update_experiencetable_path would route to ExperiencetablesController's action named ft_update. You can directly do:
<%= simple_form_for #time,:url => ft_update_experiencetable_path(#time),
remote: true do |f| %>
I have this in my routes file:
resources :payments do
member do
post :add_payment
end
end
With rake routes looking like this:
add_payment_payment POST /payments/:id/add_payment(.:format) payments#add_payment
And my form_for tag has this:
<%= form_for #loan, :url => add_payment_payment_path, :html => { :class => 'form-horizontal' } do |f| %>
Yet when i submit the form, I keep getting this error:
No route matches [PUT] "/payments/4/add_payment"
Why does it keep trying to use PUT instead of POST?
I have a form that will work sometimes and sometimes not and I can't work out what is changing between times, other than restarting the rails app. Currently it isn't working.
I have these entries in my routes file:
constraints :subdomain => 'my' do
namespace 'my', path: nil do
namespace 'author' do
resources :test_author do
resources :steps_author
[...]
end
end
end
end
The particular routes I'm interested in here produce this from rake routes
my_author_test_author_steps_author GET /author/test_author/:test_author_id/steps_author/:id(.:format) my/author/steps_author#show {:subdomain=>"my"}
PUT /author/test_author/:test_author_id/steps_author/:id(.:format) my/author/steps_author#update {:subdomain=>"my"}
DELETE /author/test_author/:test_author_id/steps_author/:id(.:format) my/author/steps_author#destroy {:subdomain=>"my"}
My form opening looks like this (using simple form and bootstrap):
<%= simple_form_for #step, :url => my_author_test_author_steps_author_path(#step), :html => { :class => 'form-horizontal' } do |f| %>
Can anyone shed some light on what is happening?
Update
Based on the help from juanpastas it seems that the form is rendering correctly however Rails is interpreting the request as a POST and not a PUT. Though for the life of me I can't work out why.
You need to pass complete params in route
<%= simple_form_for #step,
:url => my_author_test_author_steps_author_path(author, #step),
:html => { :class => 'form-horizontal' } do |f| %>
After reading your title I see you should be making POST to /author/test_author/24/steps_author/ without the last number. What about:
<% url = !#step.persisted? ? '/author/test_author/24/steps_author/' : my_author_test_author_steps_author_path(author, #step) %>
<%= simple_form_for #step,
:url => url,
:html => { :class => 'form-horizontal' } do |f| %>
I have harcoded route because I am not sure about your route helper name. You can run rake routes to find that helper.
I'm making a form_tag panel that contains information (checkboxes) specific to a controller action. This action is set up in "routes.rb" as follows:
resources :students do
collection do
get :send_student_report_pdf
end
end
This setup works perfectly when I call the action from a link_to:
<%= link_to "Download PDF Report", :action => 'send_student_report_pdf', :controller => 'students'%>
However when I used it in a form_tag, it keeps giving me this error:
Routing Error
No route matches "/students/send_student_report_pdf"
The form_tag code I have is here:
<%= form_tag :controller => 'students', :action => 'send_student_report_pdf', :method => 'get' do %>
<%= label_tag "Include columns" %> <br>
<%= check_box_tag "first_name", params[:first_name], checked = true %> <%= label_tag "First Name" %><br>
<%= submit_tag "Download PDF Report", :action => 'send_student_report_pdf', :controller => 'students'%>
<% end %>
I have tried giving it the url, path like:
<%= form_tag send_student_report_pdf_students_path, :method => 'get' do %>
But it has been consistently giving me the same Route error (as if the action doesn't exist at all in routes.rb, even though it works perfectly using link_to instead of form_tag submit
Here is the code for the action in the controller, it basically sends back a file.
def send_student_report_pdf
#students = search_sort_and_paginate
puts "params[:first_name] = ", params[:first_namea]
send_data(generate_pdf_report(#students), :filename => "report.pdf", :type => 'application/pdf')
end
If you see that I'm missing something here, please help me.
Thank you very much,
Regards,
The :method => 'get' part in your form_for is in the url_for_options hash, not the options hash, so Rails will be putting it onto the url as cgi params instead. Try changing it to this:
form_tag url_for(:controller => 'students', :action => 'send_student_report_pdf'), :method => 'get' do ...
The reason you can't use the named route is because you didn't name it in your routes. If you name it in your routes and use the named route in your form_tag, you won't need to use url_for...
resources :students do
collection do
get :send_student_report_pdf, :as => :send_student_report_pdf
end
end
You can check whether your routes are as you expect by running rake routes
Been staring at this problem for a while now. Here's the error I'm getting when I try to view the page.
No route matches {:action=>"confirm", :controller=>"locations"}
This is what I have in the view.
<%= form_for(#location, :url => { :action => :confirm }) do |f| %>
<% end %>
And I think my routes file is set up correctly.
Finder::Application.routes.draw do
resources :locations do
member do
post :confirm
end
end
root :to => 'locations/index'
end
Any ideas?
Updated:
Ran rake routes and get what I think is correct.
confirm_location POST /locations/:id/confirm(.:format) {:action=>"confirm", :controller=>"locations"}
You can debug your routes easily in the future by running $ rake routes and looking at the output. ;)
I think what is happening is that your post :confirm isn't registering the route you're expecting. In the guides, match and it's brethren accept a string as a URL segment like so:
resources :locations do
member do
post 'confirm'
end
end
Note that "confirm" is now a string instead of a symbol.
If this doesn't help, run $ rake routes and tack the output onto your question.
Update
After seeing your rake output, I think that you just need to specify the POST method on your form_for:
<%= form_for(#location, :url => { :action => :confirm }, :method => :post) do |f| %>
<% end %>
You can also make this more readable using that helper method that Rails defines:
<%= form_for(#location, :url => confirm_location_path(#location), :method => :post) do |f| %>
<% end %>
Did you define the confirm action in your LocationsController?
Try adding a :method => :post to your form_for
<%= form_for(#location, :url => { :action => :confirm }, :method => :post) do |f| %>
<% end %>
Make sure that form_for doesn't sneak in a hidden field with _method=put if you have declared the route as accepting only post in your routes file.