2015-06-07 3 views
0

Я пытаюсь дать пользователю возможность изменить статус входящих запросов друга от «непринятый» на «принято»Обновление атрибутов модели в Ruby,

пользователя Модель

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


has_many :sent_friendships, class_name: "Friendship" , foreign_key: :sender_id 
has_many :received_friendships, class_name: "Friendship", foreign_key: :receiver_id 

Дружба Модель

class Friendship < ActiveRecord::Base 
belongs_to :sender, class_name: "User" 
belongs_to :receiver, class_name: "User" 
end 

Пользователь Show View

<h1>Incoming Friend Requests</h1> 
<% current_user.received_friendships.each do |friendship| %> 
<%= friendship.sender.name %> 
<%= link_to "Accept", user_accept_path(current_user), class: 'btn btn-success', method: :post %> 
<% end %> 

Дружеские Контроллер

class FriendshipsController < ApplicationController 

def accept 
@user = User.find(params[:user_id]) 



end 

end 

Где, где я спотыкаясь, потому что я не уверен, как лучше плюс в ИО отправителя и идентификатора получателя для обновления соответствующей строки на столе модели дружбы.

Любая помощь приветствуется.

ответ

1

В каждом контроллере есть доступ к current_user переменной , вы не можете передавать его в качестве параметра, но вы должны передать ему friendship.sender.

Затем в зависимости от вас пути и архитектуры, вы можете выполнить одно из следующих действий:

  1. Создать новую Frienship

    класс FriendshipsController < ApplicationController

    def accept 
        @user = User.find(params[:id]) 
        friendship.create sender_id: current_user.id, reciever_id: @user.id 
        # or 
        # friendship.create sender_id: current_user.id, reciever_id: params[:id] 
    
        # then rdictect to somewhere 
        redirect ... 
    end 
    

    конец

  2. Если вы У вас есть дополнительные поля в модели Frienship, такие как - принято, вы можете обновить.Затем вы найдете созданную модель Frienship во время отправки дружбы приглашение и обновление поля.

    класс FriendshipsController < ApplicationController

    def accept 
        @user = User.find(params[:id]) 
        friendship = Frienship.where("sender_id = ? and reciever_id = ?", 
              # sender was passed as an argument to link_to in the view 
               @user.id, current_user.id) 
        friendship.accept = true 
        friendship.save! 
    
    
        # then rdictect to somewhere 
        redirect ... 
    end 
    

    конец

+0

Огромное спасибо, что я смог его решить! –

1

Ваш метод accept должны в основном делать множество вещей:

  1. Получить пользователя, который принимает запрос (вы должны уже это сделали для вас, как devise имеет current_user вспомогательный метод доступен в контроллере)
  2. Получите соответствующий received_friendship, чтобы узнать, какой конкретный пользователь будет новым другом для current_user
  3. Обновить объект friendship (с шага № 2), чтобы иметь acceptance (или как вы его назвали) атрибут установлен на accepted.

Как вы уже знаете, первый шаг не требует какой-либо кодировки от вас. Второй должен быть таким же простым, как установка локальной (или @instance) переменной на основе sender_id запроса на дружбу (или id конкретного friendship, что было бы еще лучше). И последний будет выглядеть как

friendship.acceptance = "accepted" 
if friendship.save 
    # TODO: redirect to somewhere with a successful notice 
else 
    # TODO: render users/show template once again with an error 
end 

Еще один намек: обратите внимание, что ваша ссылка акцепт не передавать данные, необходимые на этапе # 2:

<%= link_to "Accept", user_accept_path(current_user) %> 
+0

У меня было такое чувство, моя связь была неправильной. Будет ли user_accept_path (friendship.sender.id) тем, что мне нужно? –

+0

есть. Он предоставит данные о человеке, которого вы хотите принять. 'current_user' доступен везде. – zmii

+0

на основе вашего решения это может быть либо 'friendship.sender_id', либо' friendship.id'. мой выбор был бы последним вариантом. – twonegatives

Смежные вопросы