rails 4.2 link_to method: No route matches [POST] - ruby-on-rails-4

I'm simply trying to construct a link_to with method: :delete to call the destroy method in my users controller:
<%= link_to 'disable token', user_path(user), method: :delete, data: { confirm: 'Are you sure?'} %>
Which generates HTML that looks like:
<a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/users/6">disable token</a>
My application.js file has:
//= require jquery
//= require jquery_ujs
And, in fact, i know the javascript is loaded and doing what it is supposed to, because it generates the 'Are you sure?` alert dialog.
However, when following the link I get the following:
No route matches [POST] "/users/9"
And indeed there is no such route, because my only routes are:
users_path GET /users(.:format) users#index
user_path DELETE /users/:id(.:format) users#destroy
The mystery (to me) is WHY is Rails doing a POST to this route in the first place? You'll note that the URL is correct ("/users/9") but that the HTTP verb is not: POST.
The parameters of the request are getting set:
{"_method"=>"delete",
"authenticity_token"=>"VcAVJF1/f9mwjNI4GPteRtDiyjKobnioF0hIQvF+3BVMzUnIoHymM2Z3w2sqSLJqJ11sZ/tIHt78aA9
}
Here you can see the _method key being set to delete as it should be, so why the routing error?!?
I'm stumped.
Edit: If i change my link_to call to include remote: true Rails routes it to the proper route! So, as a "fix" for this i've changed my controller to use UJS, but i don't like this because, well, as far as I can tell what i had before should work!
Here is the link_to call which sends a proper DELETE request as JS:
<%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'}, remote: true %>

Just try explicitly stating the controller action and method also (note #user.id is an example, you may be referencing it differently) with url_for:
<%= link_to 'disable token', url_for(action: :destroy, id: #user.id), method: :delete, data: { confirm: 'Are you sure?'} %>

My suspicion in this case is that there is some other javascript that is overriding the rails behavior.
I had the same issue (but with it getting a GET request, rather than POST). It turned out to a completely unrelated bit of JS that was too general in the selector, and was calling jquery's stopPropagation on all anchor tags surrounding a button, which was how my particular HTML was set up.

Related

Rails controller specific assets for selected controllers only

I want to use the controller specific assets only for some controllers, but not for all. Hence, I didn't add the assets for which I don't need separate files. But this leads to 404 for those resources as they are not present, e.g. my app/views/layouts/dashboard.html.erb file contains the following piece of code to generate the controller specific js/css:
<%= stylesheet_link_tag 'dashboard', params[:controller], media: 'all' %>
<%= javascript_include_tag 'dashboard', params[:controller] %>
However, I do not want to create separate files for Admin controller, as the admins page has no new css/js required. But, app tries to locate the assets for the controller and since not found it returns the 404 as follows:
GET http://dashboard.localhost.com:3000/stylesheets/dashboard/admins.css 404 (Not Found)
GET http://dashboard.localhost.com:3000/javascripts/dashboard/admins.js 404 (Not Found)
What should be done to prevent this?
Moreover, there are a few controllers for which the assets are obviously not required, e.g. Registrations controller, leading to 404 for http://0.0.0.0:3000/stylesheets/store/registrations.css for http://0.0.0.0:3000/account/edit page
Here is what I did to fix this in my application.html.erb:
<%= stylesheet_link_tag 'dashboard' %>
<%= stylesheet_link_tag params[:controller] if InmonarchWebsite::Application.assets.find_asset("#{params[:controller]}.css") %>
<%= javascript_include_tag 'dashboard' %>
<%= javascript_include_tag params[:controller] if InmonarchWebsite::Application.assets.find_asset("#{params[:controller]}.js") %>

Rails 4: Delete button posting to the index action.

I am not using JS turbo links in my Rails app for several important reasons. I am having problems with one delete button:
<% if current_user?(comment.user) %>
<%= link_to "delete", micropost_response_comment_path(#micropost, #response, comment), method: :delete, data: { confirm: "You sure?" }, :class => "btn btn-default btn-xs delete" %>
<% end %>
Here is the error - its posting to the index action of the comments_controller.
{"controller"=>"comments", "action"=>"index", "micropost_id"=>"impedit-ipsam-maxime-voluptatem-quis-vitae-perferendis-voluptatem-quia-minus-officia-dolorem-aut-placeat-tempora-earum-optio-quam-saepe-velit-871c1ab8-e282-441b-b610-4d2937c9aeef", "response_id"=>"38"}
All the other delete buttons and destroy functionality on my app works. I can't see any problem here and I am not sure what else to add - I am sure more info is needed but not sure what...
If you have a suggestion and need more info please let me know.
Many thanks
You can specify the controller and action as follows:
<% if current_user?(comment.user) %>
<%= link_to "delete", { controller: "comments", action: "delete", micropost: #micropost, response: #response, comment: comment}, data: { confirm: "You sure?" }, class: "btn btn-default btn-xs delete" %>
<% end %>
Otherwise, you may have a routing issue.
the error is not showing your 3rd argument: "comment".
That is missing.
Can you identify why?
Also the error itself is not displayed. Can you select more text and bring in here?
Is that error being raised before or after the "delete" action from the controller?
Has the record already been deleted and the controller is leading you to the index correctly?
What is the full error message?
What is your "delete" action in the controller?
Regards.
Ok so I found the error and its really a string of errors that one would not have thought of. Not sure if anyone can learn from this but here goes....
Comments belong to Response which belongs to Micropost.
I had
belongs_to :response, dependent: :destroy
in my comments model rather than the other way around, therefore as I destroyed a comment, its parent was also destroyed.
In my destroy method in the comments controller I had a redirect
format.html { redirect_to micropost_response_comments_path(#micropost, #response) }
after the destroy, which was now impossible because #response was always destroyed with it......
Calamity of errors. Thanks for your time guys...
Message is:
IF YOU HAVE STRANGE BEHAVIOURS OCCURRING WHEN DELETING OBJECTS, MAKE SURE YOUR RELATIONSHIPS FOR THAT MODEL, ITS PARENTS AND ITS CHILDREN ARE CORRECT.

RubyonRails Guide confusion over link creation in Ruby

I am a beginner to Rails. Was working along with Railsguide for Rails 4.
One confusion i have is:
for adding a link , somewhere it is written like:
<h1>Hello, Rails!</h1>
<%= link_to "My Blog", controller: "posts" %>
whereas somewhere its like
<%= link_to 'New post', new_post_path %>
Please clarify the difference.
Good question. Both of these are link helpers, and both are resource-oriented (check out the Rails UrlHelper docs for more information).
The first one will render a link that is associated with the particular controller:
<%= link_to "My Blog", controller: "posts" %>
<a href='/posts'>
The second will render the Rails path specific to creating a new Post object (this is also resource-oriented). Check out section 2.3 in the Rails routing guide:
<%= link_to 'New post', new_post_path %>
<a href='/posts/new'>

error getting path returned rails 4

I'm trying to access my page gallery/new via a link, so i have created this
<%= link_to 'New gallery' new_gallery_path %>
rake routes gives
gallery_index_path GET /gallery(.:format) gallery#index
POST /gallery(.:format) gallery#create
new_gallery_path GET /gallery/new(.:format) gallery#new
edit_gallery_path GET /gallery/:id/edit(.:format) gallery#edit
gallery_path GET /gallery/:id(.:format) gallery#show
PATCH /gallery/:id(.:format) gallery#update
PUT /gallery/:id(.:format) gallery#update
DELETE /gallery/:id(.:format) gallery#destroy
and within my routes i have
resources :gallery
My view at gallery/new is
<%= nested_form_for #gallery, :html => { :multipart => true} do |f| %>
--content here
<% end %>
whenever i click the link to view this page i get
undefined method `galleries_path
Can someone point out my mistake, please?
You've chosen the wrong name for your resources. It should always be pluralized:
resources :galleries
From this Rails will generate the plural and singular paths correctly. galleries_path for the index, gallery_path for show, etc etc.

Dropdown select list won't display items with custom forms of Zurb Foundation 4 and Rails 4

I've been having this annoying problem in which I click over a select dropdown input of my custom form, styled with Zurb Foundation 4 in my Rails application, and the list won't show its elements.
I thought at a start that was a problem with simple form, but I changed the f.association for f.collection_select, my code looks like this:
<h2><%= I18n.t(".sign_up") %></h2>
<%= simple_form_for(resource, :html => {:class => "custom"}, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= f.error_notification %>
<%= devise_error_messages! %>
<%= f.input :rut %>
<%= f.input :name %>
<%= f.input :email %>
<div>
<%= f.label :supplier_type_id %>
<%= f.collection_select :supplier_type_id, SupplierType.all, :id, :name %>
</div>
<%= f.input :password %>
<%= f.input :password_confirmation %>
<%= f.error :base %>
<%= f.submit I18n.t(".sign_up"), :class => "button" %>
<% end %>
<%= render "devise/shared/links" %>
The most strange thing is that sometimes I'm able to see the items when refreshing the page, but when I get to the page navigating from other view of the app then it won't work. I've also noticed this when using hints for forms (i.e: If I have two hints in the same form, in different inputs, only one would show, but the same one message displays in both inputs when each message should show in their respective input. When reloading the page sometimes it shows one hint, and sometimes the other)
The styling looks good, so I think that it might be a foundation javascript problem.
Another thing I've noticed is that when I load the page the styling does a kind of "blinking" when using custom forms. This blinking it looks likes foundation takes a while to load the styling, I've also noticed this on their own custom form documentation site. This may indicate that is a form styled with javascript events or something similar, so this might mean that javascript is working well.
In addition, the checkboxes are having a similar problem, they only can be checked just when you reload the page, it might have some relation with this problem.
I'm very lost, some help would become very handy. Thanks!
--edit: Foundation 5 doesn't include custom forms and works better--
You might need to refresh dropdowns on each page:change event. Try something like this:
$(document).on("page:change", function() {
// SELECTOR_TO_CUSTOM_DROPDOWNS should select any Zurb custom dropdowns you
// are using.
$(SELECTOR_TO_CUSTOM_DROPDOWNS).trigger("change");
});
That's from the documentation on Zurb custom form JS.
Yes, this is caused by turbolinks. It stops $(document).ready from firing on page load, which is required by foundation's custom forms.
Using ssorallen's answer and to be more unobtrusive than the OPs, add this to application.js:
$(function(){ $(document).foundation(); });
$(document).on("page:change", function() {
if ($('form.custom').length > 0) {
$(document).foundation('forms');
}
});
Also, if you have jquery/coffeescript that relies on document ready being fired, add jquery turbolinks to your Gemfile.
Ok, so I just figured out that I have repeated asset load on my browser. This is causing a javascript error. It appears that deleting in the manifest
//= require turbolinks
Solves the problem.
I solved my multiple asset problem changing
<%= javascript_include_tag "application" %>
To the head in my application layout.
After watching the turbolinks railscast I noticed that besides my multiple asset loading, turbolinks and foundation 4 may not be compatible, it might be a solution on this post. But still doesn't work perfect for me.
I also noticed that navbar is also affected by turbolinks.
I think that this is rather a turbolinks problem and not an specific foundation dropdown. I will close this question and open a new on turbolinks and foundation.
Thanks to some Nick Reed insights I found out that the foundation gem was initializing foundation in application.js like this:
$(function(){ $(document).foundation(); });
So I checked the docs and I used this:
<script>
$(document).foundation();
</script>
After the "/body" tag in the application layout and everything seems to be working like a charm!