Нужна уникальная помощь в дружбе Rails 3

Мне нужна помощь по поводу уникальности дружбы и добавить в друзья мои route.rb:

devise_for :users

resources :users, only: [:index, :show] do
          resources :friendships, only: [:create, :destroy]
          end

моя модель пользователя:

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

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username
  # attr_accessible :title, :body
  has_many :topics
  has_many :posts
  has_many :friendships
    has_many :friends, :through => :friendships
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end

моя модель дружбы:

class Friendship < ActiveRecord::Base
  attr_accessible :friend_id, :user_id
  belongs_to :user
    belongs_to :friend, :class_name => "User"
end

Friendships_controller.rb:

class FriendshipsController < ApplicationController
    before_filter :authenticate_user!

    def create
        @friendship = current_user.friendships.build(:friend_id => params[:friend_id])
        if @friendship.save
            flash[:notice] = "Arkadaşlara eklendi."
            redirect_to root_url
        else
            flash[:error] = "Arkadaşlara Eklenemiyor."
            redirect_to root_url
        end
    end

    def destroy
        @friendship = current_user.friendships.find(params[:id])
        @friendship.destroy
        flash[:notice] = "Arkadaşlarımdan kaldırıldı."
        redirect_to current_user
    end
end

users_controller.rb:

class UsersController < ApplicationController
    before_filter :authenticate_user!

  def index
        @users = User.all
  end
  def show
    @user = User.find(params[:id])
    @topics = @user.topics.paginate(page: params[:page])
    @friendship = @user.friendships.build(:friend_id => params[:friend_id])
    @friendships = @user.friendships.all

  end 
end

Это мой друг добавить ссылку:

 <h1>
        <%= @user.username %>
      </h1>

            <%= link_to "Arkadaşlarıma Ekle", friendships_path(:friend_id => @user), :method => :post,class: "btn btn-large btn-primary" %>

И я не могу найти правильный путь для отображения пользователей как друзей.

<%  for friendship in @friendships %> 
<%= link_to friendship.friend.username, '#' %>
(<%= link_to 'Sil', friendship, :method => :delete %>)
<% end %>

Может кто-нибудь помочь мне ?


person ytsejam    schedule 09.07.2012    source источник
comment
В консоли вы можете запустить rake routes это покажет все доступные маршруты с их именами   -  person tommasop    schedule 09.07.2012


Ответы (1)


Учитывая вложенные маршруты, ему нужно будет знать пользователя, чтобы получить дружбу. Вы можете использовать крутых помощников, которые проложат вам путь от объектов

Немного более идиоматически рубиновый

<%  @friendships.each do |friendship} %> 
  <%= link_to friendship.friend.username, '#' %>
  (<%= link_to 'Sil', [@user, friendship], :method => :delete %>)
<% end %>

То же самое будет и со ссылкой "Добавить в друзья"... но мне не понятна логика - какой @user у вас есть на данном этапе? Является ли @user зарегистрированным пользователем или «текущим» пользователем?

Поскольку вы используете Devise... вполне вероятно, что вы действительно хотите:

<%  current_user.friendships.each do |friendship} %> 
  <%= link_to friendship.friend.username, '#' %>
  (<%= link_to 'Sil', [current_user, friendship], :method => :delete %>)
<% end %>

Если этот фрагмент со страницы другого пользователя... тогда это больше похоже на

<h1><%= @user.username %></h1>

<%= link_to "Arkadaşlarıma Ekle", user_friendships_path(current_user, :friend_id => @user), :method => :post, class: "btn btn-large btn-primary" %>
person mylescarrick    schedule 09.07.2012
comment
Это полностью зависит от того, сколько javascript вы хотите использовать, и от пользовательского опыта, который вам нужен. Я бы сделал это без вложенных атрибутов — просто вызовите существующее действие create в контроллере дружбы. - person mylescarrick; 10.07.2012