簡體   English   中英

嘗試與Rails實現朋友,當我嘗試路由到任何控制器方法時,出現No Route Matches [GET]錯誤

[英]Trying to implement friends with Rails, getting a No Route Matches [GET] error when I try to route to any controller method

在過去的幾個小時里,我一直在尋找答案,但我感到非常沮喪,我是Rails的新手,所以我覺得這是一個愚蠢的錯誤,或者我做錯了什么。 請幫助我解決此錯誤。 這是我的控制器:

class FriendshipsController < ApplicationController
    before_action :authenticate_user!
    before_action :def_user, only: [:create, :accept, :deny, :destroy]

    def index
        @user = current_user
        @friends = @user.friends.paginate :page => params[:page]
        @pending_friends = @user.pending_friends.paginate :page => params[:page]
    end

    def show
    end

    def create
        Friendship.request(@user1, @friend)
        flash[:success] = "Friend request has been sent to #{@user2.screenname}."
        redirect_to user_path(@friend)
    end

    def accept
        Freindship.accept(@user1, @friend)
        flash[:success] = "Friend request from #{@user2.screenname} has been accepted."
        redirect_to friends_path
    end

    def deny
        Friendship.breakup(@user1, @friend)
        flash[:success] = "Friend request from #{@user2.screenname} has been declined."
        redirect_to friends_path
    end

    def destroy
        Friendship.breakup(@user1, @friend)
        flash[:success] = "#{@user2.screenname} has been successfully removed from your friends list."
        redirect_to friends_path
    end

    private

    def def_user
        @user1 = current_user
        @friend = User.find(params[:id])
    end
end

和我的模型:

class Friendship < ActiveRecord::Base
    belongs_to :user
    belongs_to :friend, :class_name => 'User'


    def self.request(user, friend)
        unless user == friend or Friendship.exists?(user, friend)
            transaction do
                create(:user => user, :friend => friend, :status => 'pending')
                create(:user => friend, :friend => user, :status => 'requested')
            end
        end
    end

    def self.accept(user, friend)
        transaction do
            accepted_at = Time.now
            accept_one_side(user, friend, accepted_at)
            accept_one_side(friend, user, accepted_at)
        end
    end

    def self.breakup(user, friend)
    transaction do
      destroy(find_by_user_id_and_friend_id(user, friend))
      destroy(find_by_user_id_and_friend_id(friend, user))
      end
    end

    private

    def self.accept_one_side(user, friend, accepted_at)
        request = find_by_user_id_and_friend_id(user, friend)
        request.status = 'accepted'
        request.accepted_at = accepted_at
        request.save!
    end
end

在我的路線文件中

get 'friends/create', to: 'friendships#create', as: 'add_friend'

我認為這行是這樣的:

<%= link_to "Send Friend Request", add_friend_path(current_user, @user), method: :get, class: "btn btn-default" %>

我也嘗試過

<%= link_to 'Send Friend Request', {:controller => 'friendships', :action => 'create', :id => @user.id}, :class => "btn btn-default" %>

對不起,很抱歉,非常感謝您的幫助。

請考慮在路由中添加:id

get 'friends/create/:id', to: 'friendships#create', as: 'add_friend'

您試圖通過params[:id]獲取def_user,但路由中不存在id

只是個想法:

該代碼

flash[:success] = "Friend request from #{@user2.screenname} has been accepted."

將失敗

undefined method `screenname' for nil:NilClass

因為它沒有定義@user2

另外請注意,CRUD實現假定使用不同的HTTP方法,如POSTPUTDELETE

因此,創建友誼POST方法比GET更適合。 denydestroy操作也是如此。

Rails提供了方便的資源路由http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM