ActionController :: RoutingError(没有路由与[POST]“ / venues / 2 / heart / 2”匹配):

时间:2019-09-07 01:20:29

标签: ruby-on-rails routes

嗨,我有一个简单的应用,其中包含用户,场所和心脏模型

用户模型

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

非常感谢您的帮助

3 个答案:

答案 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方法来更新对象。

相关问题