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