ruby-on-rails - 我的 CREATE & DELETE 路线不起作用不明白为什么?
问题描述
您好,我正在尝试在我的应用中创建书签功能。我已经创建了我想要添加书签的模型(发型),我还有一个用户模型和一个“Saved_Hairstyle”模型,它是场景中的连接表。在我的 routes.rb 文件中,我添加了一个 CREATE & DELETE 路由。在我的控制器中,我写出了 CREATE & DELETE 方法。然后我继续在我的视图中链接到我的 CREATE & DELETE 方法路径。
我希望当我单击 CREATE Link 时会触发 POST 方法,以便我可以将页面上的元素显示为“已添加书签”,并且当我单击 DELETE 链接时会触发 DELETE 方法以便我可以显示元素在页面上显示为“未标记”,但它们不起作用。当我在 Rails CI 中执行 RAILS ROUTES 时,可以看到正确的路径,但是当我单击链接时,什么都不做。回购方便理解:https ://github.com/Angela-Inniss/hair-do
路线.rb
Rails.application.routes.draw do
root to: 'pages#home'
devise_for :users
resources :hairstyles do
member do
put "like", to: "hairstyles#upvote"
put "dislike", to: "hairstyles#downvote"
end
resources :comments, only: :create
resources :saved_hairstyles, only: [:new,:create]
end
resources :saved_hairstyles, only: :destroy
resources :comments, only: :destroy
resources :hairdressers
end
class SavedHairstylesController < ApplicationController
def create
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@saved_hairstyle = SavedHairstyle.new(user: current_user, hairstyle: @hairstyle)
if @saved_hairstyle.save
respond_to do |format|
format.html { redirect_to hairstyle_path(@saved_hairstyle.hairstyle) }
format.js # <-- will render `app/views/comments/create.js.erb`
end
else
respond_to do |format|
format.html { render 'hairstyles' }
format.js # <-- idem
end
end
end
end
def destroy
@saved_hairstyle = SavedHairstyle.find(params[:id])
@saved_hairstyle.destroy
@hairstyle = @saved_hairstyle.hairstyle
respond_to do |format|
format.html { redirect_to hairstyle_path(@saved_hairstyle.hairstyle }
format.js
end
end
视图.html.erb
<div class="bookmark">
<% saved_hairstyle = SavedHairstyle.find_by(user: current_user, hairstyle: hairstyle.id) %>
<% if saved_hairstyle %>
<%= link_to hairstyle_saved_hairstyle_path(saved_hairstyle), method: :post do %>
<i class="fas fa-plus"></i>
<% end %>
<% else %>
<%= link_to saved_hairstyle_path(hairstyle), method: :delete do %>
<i class="fas fa-plus-circle"></i>
<% end %>
<% end %>
</div>
create.js.erb 文件(这是我希望在 POST 请求中发生的事情(我对 DELETE 请求有类似的东西)
plusCircle = document.getElementById("bookmark");
plusCircle.innerHTML = `<%= link_to '#', method: :post do %>
<i class="fas fa-plus"></i>
<% end %>`
解决方案
您的视图逻辑似乎存在一些错误。您正在加载已保存的发型并尝试再次为其添加书签。如果保存的发型不存在,您还试图删除它。路径助手似乎也是错误的(删除方法不是嵌套的,嵌套的资源应该是复数)。也许它应该看起来像这样:
<div class="bookmark">
<% saved_hairstyle = SavedHairstyle.find_by(user: current_user, hairstyle: hairstyle.id) %>
<% if saved_hairstyle %>
<%= link_to saved_hairstyle_path(saved_hairstyle), method: :delete do %>
<i class="fas fa-plus-circle"></i>
<% end %>
<% else %>
<%= link_to hairstyle_saved_hairstyles_path(hairstyle), method: :post do %>
<i class="fas fa-plus"></i>
<% end %>
<% end %>
</div>
顺便说一句,如果您检查控制台,您可能会看到一些错误,这些错误会为您指明正确的方向。您还应该将 saved_hairstyle 查询移至辅助方法。
推荐阅读
- javascript - 如何在单独的选择组件中键入 forwardRef?
- amazon-web-services - 我应该使用数据仓库还是数据库或其他东西?
- python - 连接两个numpy数组
- amazon-ec2 - 无法将 LogStash 连接到 AWS ElasticSearch “尝试恢复与死 ES 实例的连接,但出现错误”
- function - 如何在不使用命令行的情况下使用具有 CLAP 的 Rust crate 的功能?
- node.js - 如何使用 Nodejs 实现 Hyperledger Fabric
- python - 如何使用 Python wget 或 urllib3 连续下载文件
- javascript - 用javascript从另一个域服务器读取响应cookie
- html - 如何在输入元素的 HTML 模式属性中设置 RegEx 全局标志?
- javascript - 如何通过从 input type='file' 中选择来设置多个视频文件的预览