![](/img/trans.png)
[英]Getting “No Route matches” error when though I have a method in my controller
[英]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方法,如POST
, PUT
和DELETE
因此,創建友誼POST
方法比GET
更適合。 deny
和destroy
操作也是如此。
Rails提供了方便的資源路由http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.