Rails 按钮上的路由不起作用...但它们可以吗?

Routes on Rails buttons don't work... But they do?

我有一个很奇怪的问题。我在 Rails 应用程序中有一个手风琴菜单。我在菜单中有一组 link 转到各自的 "posts." 这工作正常,除了我需要 link 周围的区域是可点击的,而不仅仅是文本。所以我将它们切换为按钮。不是火箭科学。除了一个奇怪的问题,一切正常。当我点击按钮时,我得到路由错误页面。它说:

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

对于 URL 中的路线:

http://localhost:3000/posts/14

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

这是我的下拉菜单的一部分。第一部分 "Beginner," 是我的新按钮布局示例。除非我重新加载错误页面,否则它不起作用。第二部分 "Strumming" 是旧的 link 布局。它按应有的方式工作:

<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

谁能告诉我这是怎么回事?我很迷茫。

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 %>