嗨,我有一个简单的应用,其中包含用户,场所和心脏模型
用户模型
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :masqueradable, :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable
has_many :hearts, dependent: :destroy
has_many :venues, through: :hearts
def hearts?(venue)
venue.hearts.where(user_id: id).any?
end
end
场地模型
class Venue < ApplicationRecord
has_many :hearts, dependent: :destroy
has_many :users, through: :hearts
end
心脏模型
class Heart < ApplicationRecord
belongs_to :user
belongs_to :venue
validates :user_id, uniqueness: { scope: :venue_id }
end
我的问题是,当我通过场所视图创建心脏时,我得到了ActionController :: RoutingError(没有路线与[POST]“ / venues / 2 / heart / 2”匹配):
app / views / venues / show.html.erb
<div class="row mb-3">
<div class="col text-center">
<h1><%= @venue.name %></h1>
</div>
</div>
<div class="row mb-3">
<div class="col text-center">
<%= render partial: 'heart', locals: {venue: @venue} %>
</div>
</div>
app / views / venues / _heart.html.erb
<% if user_signed_in? && current_user.hearts?(venue) %>
<%= link_to venue_heart_path(venue), method: :delete, remote: true do %>
<i class="fas fa-heart fa-2x" style="color: #cc0000"></i>
<% end %>
<% else %>
<%= link_to venue_heart_path(venue), method: :post, remote: true do %>
<i class="far fa-heart fa-2x" style="color: #cc0000"></i>
<% end %>
<% end %>
<p><%= venue.hearts.count %> <%= (venue.hearts.count) == 1 ? 'Heart' : 'Hearts'%></p>
<% @venue.hearts.each do |heart| %>
<%= image_tag heart.user.avatar_url, width: 20 %>
<% end %>
这是我的心脏和路线管理员| grep场地
app / controllers / venues / hearts_controller.rb
class Venues::HeartsController < ApplicationController
before_action :authenticate_user!
before_action :find_venue!
def create
@venue.hearts.where(user: current_user).first_or_create
redirect_to venue_path(@venue), :notice => 'Hearted!'
end
def destroy
@venue.hearts.where(user: current_user).destroy_all
redirect_to venue_path(@venue), :notice => 'UnHearted, you are heartless!'
end
private
def find_venue!
@venue = Venue.find(params[:venue_id])
end
end
rake routes | grep venue
warning ../package.json: No license field
venue_heart_index GET /venues/:venue_id/heart(.:format) venues/heart#index
POST /venues/:venue_id/heart(.:format) venues/heart#create
new_venue_heart GET /venues/:venue_id/heart/new(.:format) venues/heart#new
edit_venue_heart GET /venues/:venue_id/heart/:id/edit(.:format) venues/heart#edit
venue_heart GET /venues/:venue_id/heart/:id(.:format) venues/heart#show
PATCH /venues/:venue_id/heart/:id(.:format) venues/heart#update
PUT /venues/:venue_id/heart/:id(.:format) venues/heart#update
DELETE /venues/:venue_id/heart/:id(.:format) venues/heart#destroy
venues GET /venues(.:format) venues#index
POST /venues(.:format) venues#create
new_venue GET /venues/new(.:format) venues#new
edit_venue GET /venues/:id/edit(.:format) venues#edit
venue GET /venues/:id(.:format) venues#show
PATCH /venues/:id(.:format) venues#update
PUT /venues/:id(.:format) venues#update
DELETE /venues/:id(.:format) venues#destroy
config / routes.rb
需要“ sidekiq / web”
Rails.application.routes.draw do
resources :venues do
resources :heart, module: :venues
end
非常感谢您的帮助
答案 0 :(得分:1)
正如前面的答案所建议的那样,您在链接中使用的路径为场地创建新的心脏是不正确的。
看看创造一颗心的途径。似乎没有前缀,但是前缀与之前(适用于heart#index)的路由相同。因此,创建新心脏的链接应带有venue_heart_index_path(venue)
。
我假设您没有在resources
文件中使用routes.rb
?
答案 1 :(得分:1)
好的,所以在@arieljuod和@clara的帮助下,我找到了解决方案:
问题源于我从这里https://github.com/gorails-screencasts/gorails-24-liking-posts/blob/master/config/routes.rb开始所做的后续工作
因为我有资源但没有资源,所以Rails要求在创建时使用单数。
venue_heart_path无效,venue_heart_index_path扔了一个
ActionController::RoutingError (uninitialized constant Venues::HeartController
Did you mean? Venues::HeartsController): error
我回到
<%= link_to venue_hearts_path(venue), method: :post, remote: true do %>
<i class="far fa-heart fa-2x" style="color: #cc0000"></i>
<% end %>
并将路线更改为
resources :venues do
resources :hearts, module: :venues
end
和创建工作...但是删除没有。我不得不将其更改为:
<%= link_to venue_heart_path(venue), method: :delete, remote: true do %>
<i class="fas fa-heart fa-2x" style="color: #cc0000"></i>
<% end %>
繁荣起来
答案 2 :(得分:0)
您没有使用该格式和POST方法的路由:
venue_heart GET /venues/:venue_id/heart/:id(.:format) venues/heart#show
PATCH /venues/:venue_id/heart/:id(.:format) venues/heart#update
PUT /venues/:venue_id/heart/:id(.:format) venues/heart#update
DELETE /venues/:venue_id/heart/:id(.:format)
使用PATCH por PUT方法来更新对象。