Rails按钮上的路由不起作用......但它们确实有效吗?

时间:2017-04-11 18:07:16

标签: ruby-on-rails ruby erb

我有一个非常奇怪的问题。我在Rails应用程序中有一个手风琴菜单。我在菜单中有一组链接到相应的“帖子”。这工作正常,除了我需要链接区域可点击,而不仅仅是文本。所以我把它们换成按钮。不是火箭科学。一切都有效,除了一个奇怪的问题。当我点击按钮时,我收到了路由错误页面。它说:

No route matches [POST] "/posts/14"

对于URL中的路线:

http://localhost:3000/posts/14

现在,非常非常奇怪的是,如果我尝试重新发送URL请求...页面加载。它只在我使用按钮时停止。但是,如果我从路由错误页面重新加载页面,我会收到帖子。什么???

以下是我的下拉菜单中的一部分。第一部分“初学者”是我的新按钮布局的一个示例。除非我重新加载错误页面,否则它不起作用。第二部分“Strumming”是旧的链接布局。它的工作方式应该是:

<button class="accordion">Beginner</button> 
<div class="panel">
    <% if @beginner.empty? %> 
        <p class="sidebar_lesson"><i>No lessons available</i></p>
    <% else %> 
        <% @beginner.each do |p| %> 
            <%= button_to p.title, post_path(p), class: 'sidebar_lesson' %>
        <% end %>
    <% end %> 
</div>
<button class="accordion">Strumming</button>
    <div class="panel">
        <% if @strumming.empty? %> 
            <p class="sidebar_lesson"><i>No lessons available</i></p>
        <% else %>
            <% @strumming.each do |p| %> 
                <p class='sidebar_lesson'><%= link_to p.title, post_path(p) %></p>
            <% end %>
        <% end %> 
    </div>

以下是我的路线,其中包括我要求的路线:

       new_user_session GET    /users/sign_in(.:format)       users/sessions#new
        user_session POST   /users/sign_in(.:format)       users/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)      users/sessions#destroy
   new_user_password GET    /users/password/new(.:format)  devise/passwords#new
  edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
       user_password PATCH  /users/password(.:format)      devise/passwords#update
                     PUT    /users/password(.:format)      devise/passwords#update
                     POST   /users/password(.:format)      devise/passwords#create
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
   user_registration PATCH  /users(.:format)               devise/registrations#update
                     PUT    /users(.:format)               devise/registrations#update
                     DELETE /users(.:format)               devise/registrations#destroy
                     POST   /users(.:format)               devise/registrations#create
               posts GET    /posts(.:format)               posts#index
                     POST   /posts(.:format)               posts#create
            new_post GET    /posts/new(.:format)           posts#new
           edit_post GET    /posts/:id/edit(.:format)      posts#edit
                post GET    /posts/:id(.:format)           posts#show
                     PATCH  /posts/:id(.:format)           posts#update
                     PUT    /posts/:id(.:format)           posts#update
                     DELETE /posts/:id(.:format)           posts#destroy
                root GET    /                              posts#index

有人能让我知道这里发生了什么吗?我很迷茫。

1 个答案:

答案 0 :(得分:2)

button_to默认使用HTTP POST方法https://cardoni.net/rails-button-to-vs-link-to-url-helpers/

你想要的是让你的button_to向你的路线发出GET请求。您可以通过指定类似的方法

来完成此操作
    <% @beginner.each do |p| %> 
        <%= button_to p.title, post_path(p), method: :get, class: 'sidebar_lesson' %>
    <% end %>