Trying to implement friends with Rails, getting a No Route Matches [GET] error when I try to route to any controller method -
i've been searching answer past few hours , i'm frustrated, i'm new rails feel stupid mistake or did totally wrong. please me fix error. here controller:
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 #{@user2.screenname}." redirect_to user_path(@friend) end def accept freindship.accept(@user1, @friend) flash[:success] = "friend request #{@user2.screenname} has been accepted." redirect_to friends_path end def deny friendship.breakup(@user1, @friend) flash[:success] = "friend request #{@user2.screenname} has been declined." redirect_to friends_path end def destroy friendship.breakup(@user1, @friend) flash[:success] = "#{@user2.screenname} has been removed friends list." redirect_to friends_path end private def def_user @user1 = current_user @friend = user.find(params[:id]) end end and model:
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 create(:user => user, :friend => friend, :status => 'pending') create(:user => friend, :friend => user, :status => 'requested') end end end def self.accept(user, friend) transaction 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 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 in routes file have
get 'friends/create', to: 'friendships#create', as: 'add_friend' the line in views calls this:
<%= link_to "send friend request", add_friend_path(current_user, @user), method: :get, class: "btn btn-default" %> i have tried
<%= link_to 'send friend request', {:controller => 'friendships', :action => 'create', :id => @user.id}, :class => "btn btn-default" %> sorry noobiness, , thank help.
please consider add in :id route.
get 'friends/create/:id', to: 'friendships#create', as: 'add_friend' you trying def_user params[:id], id not present in route.
just thougths:
that code
flash[:success] = "friend request #{@user2.screenname} has been accepted." will fail
undefined method `screenname' nil:nilclass because it's no @user2 defined.
also pleae note crud implementation assumes use different http methods post, put , delete
so, creating friendship post method suits better get. same deny , destroy actions.
rails provides convenient resource routes http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default
hope helps.
Comments
Post a Comment