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 %>
我有一个很奇怪的问题。我在 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 %>