【问题标题】:undefined method for route in nested resource嵌套资源中路由的未定义方法
【发布时间】:2015-04-19 08:31:44
【问题描述】:

我想要完成的是在我的视图中创建 POST 和 DELETE 链接,例如,作为一个赞按钮。

我在我的用户模型(user.rb)中创建了一个方法(def like),它将检查用户是否喜欢书签,并根据响应分别显示“不喜欢”或“喜欢”按钮我喜欢的方法。

我有以下代码:

Routes.rb:

Rails.application.routes.draw do

  resources :topics do
    resources :bookmarks do
      resources :likes, only: [:create, :destroy]
    end
  end

  devise_for :users

  get 'welcome/index'
  get 'welcome/about'

  root to: 'welcome#index'

  post :incoming, to: 'incoming#create'
end

用户.rb:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :topics, dependent: :destroy
  has_many :bookmarks, dependent: :destroy
  has_many :likes, dependent: :destroy

  def admin?
    role == 'admin'
  end

  def moderator?
    role == 'moderator'
  end

  def liked(bookmark)
    likes.where(bookmark_id: bookmark.id).first
  end

end

likes_controller.rb:

class LikesController < ApplicationController

  def create
    @bookmark = Bookmark.find(params[:bookmark_id])
    like = current_user.likes.build(bookmark: @bookmark)

    if like.save
      flash[:notice] = "Bookmark was Liked!"
      redirect_to [@bookmark.topic, @bookmark]
    else
      flash[:error] = "Unable to Like Bookmark"
      redirect_to @bookmark
    end
  end

  def destroy
    @bookmark = Bookmark.find(params[:bookmark_id])
    like = current_user.likes.find(params[:id])

    if like.destroy
      flash[:notice] = "Bookmark was Un-liked."
      redirect_to [@bookmark.topic, @bookmark]
    else
      flash[:error] = "Error Un-liking bookmark."
      redirect_to [@bookmark.topic, @bookmark]
    end
  end

end

最后是我喜欢的部分,_like.html.erb:

<div>
  <% if like = current_user.liked(bookmark) %>
    <%= link_to [bookmark, like], class: 'btn btn-danger', method: :delete do %>
      <i class="glyphicon glyphicon-star-empty"> </i>&nbsp; Unlike
    <% end %>
  <% else %>
    <%= link_to [bookmark, Like.new], class: 'btn btn-primary', method: :post do %>
      <i class="glyphicon glyphicon-star"> </i>&nbsp; Like
    <% end %>
  <% end %>
</div>

我想在我的主题#index 视图中使用:

<h2 id="page-title">All Bookmarks</h2>

<div class="row">
  <div class="col-md-8">
    <% @topics.each do |topic| %>
      <h4><%= link_to "##{topic.title}", topic_path(topic.id) %></br></h4>
      <% topic.bookmarks.each do |bookmark| %>
        <%= render partial: 'likes/like', locals: { bookmark: bookmark } %>
        <%= link_to "#{bookmark.url}", "http://#{bookmark.url}", target: "_blank" %></br>
      <% end %>
    <% end %>
  </div>
  <div class="col-md-4">
    <%= link_to "New Topic", new_topic_path, class: 'btn btn-primary' %>
  </div>
</div>

当我运行我的服务器并转到我的索引视图时,我收到以下 NoMethodError:

# 的未定义方法“bookmark_likes_path”

指向这一行:

<%= link_to [bookmark, Like.new], class: 'btn btn-primary', method: :post do %>

位于我喜欢的部分(_like.html.erb)中

我认为问题是路由问题,因为据我所知,问题在于方法 bookmark_likes_path 为 nil,如果我检查我的 rake 路由,我会得到以下信息:(使用 grep)

topic_bookmark_likes POST   /topics/:topic_id/bookmarks/:bookmark_id/likes(.:format)     likes#create
     topic_bookmark_like DELETE /topics/:topic_id/bookmarks/:bookmark_id/likes/:id(.:format) likes#destroy

这表示我的点赞路线,它表示(因为是嵌套资源)访问主题内部的 POST 和 DELETE 操作的正确路线,因此路径需要是 /topics/:topic_id/bookmarks/ :bookmark_id/likes 用于创建,/topics/:topic_id/bookmarks/:bookmark_id/likes/:id 用于删除,所以我像这样更新了我的like部分:

<div>
  <% if like = current_user.liked(bookmark) %>
    <%= link_to [@topic, bookmark, like], class: 'btn btn-danger', method: :delete do %>
      <i class="glyphicon glyphicon-star-empty"> </i>&nbsp; Unlike
    <% end %>
  <% else %>
    <%= link_to [@topic, bookmark, Like.new], class: 'btn btn-primary', method: :post do %>
      <i class="glyphicon glyphicon-star"> </i>&nbsp; Like
    <% end %>
  <% end %>
</div>

仍然是同样的错误。我一直在尝试调试这个错误很长时间,但我无法修复它,我需要一些帮助。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby bloc.io


    【解决方案1】:

    我已经修好了。

    问题确实出在嵌套资源上,我所做的是像这样分离资源:

      resources :topics do
        resources :bookmarks
      end
    
      resources :bookmarks do
        resources :likes, only: [:create, :destroy]
      end
    

    这样就解决了,所以我不必为了深入了解细节而弄乱长途路线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2016-10-07
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多