Я не уверен, в чем проблема, чтобы узнать, о чем именно я прошу, но я сделаю все возможное. Я попытался выделить жирным шрифтом то, что, по моему мнению, является проблемой, чтобы прояснить ситуацию.
Я работаю с ajax в первый раз. В приложении пользователь (1) ищет пользователя (2), найдя пользователя (2), пользователь (1) может нажать кнопку «добавить отношения», которая отправляет запрос на отношения пользователю (2). кнопка «добавить отношения» должна сразу же измениться на «запрошенные отношения», а затем, после обновления страницы, кнопка должна измениться на «изменить отношения».
«добавить отношения» = отношения еще не существуют «запрошенные отношения» = ожидающие отношения существуют, действует как мгновенное сообщение об успешном выполнении «изменить отношения» = ожидающие отношения существуют или существуют принятые отношения
Все работает, за исключением последней части, где кнопка должна измениться на «изменить отношения» после обновления страницы браузера. Вместо этого появляется «добавить отношение»
Есть идеи, что эта кнопка «редактировать отношения» не появится? Я использую конечный автомат, драпировщик и драгоценные камни js-routes.
просмотр/пользователи/индекс:
где при поиске пользователя (2) появляется его имя, а рядом с именем появляется кнопка «добавить отношения», «редактировать отношения» или «запрошенные отношения».
Я думаю, здесь не работает оператор if. Почему он не находит взаимосвязь на основе того, находится ли она на рассмотрении или принята?
<% if logged_in? %>
<ul>
<% @users.each do |user| %>
<li>
<%= user.name %>
<div id="relationship-status">
<% if current_user.following.include?(user.id) || current_user.pending_following.include?(user.id) %>
<%= link_to "Edit Relationship", edit_relationship_path(followed_id: user.id), class: "btn btn-primary" %>
<% else %>
<%= link_to "Add Relationship", new_relationship_path(followed_id: user.id), class: "btn btn-primary", id: 'add-relationship', data: { followed_id: user.id.to_param } %>
<% end %>
</div>
</li>
<% end %>
</ul>
<% end %>
контроллер/пользователи:
def index
@users = User.search(params[:search])
end
отношения.js:
$(document).ready(function() {
$('#add-relationship').click(function(event) {
event.preventDefault();
var addRelationshipBtn = $(this);
$.ajax({
url: Routes.relationships_path({relationship: { followed_id: addRelationshipBtn.data('followedId') }}),
dataType: 'json',
type: 'POST',
success: function(e) {
addRelationshipBtn.hide();
$('#relationship-status').html("<a href='#' class='btn btn-success'>Relationship Requested</a>");
}
});
});
});
модель/пользователь:
class User < ActiveRecord::Base
has_one :profile, dependent: :destroy
has_many :pending_relationships, class_name: "Relationship",
foreign_key: "follower_id"
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
has_many :passive_relationships, class_name: "Relationship",
foreign_key: "followed_id",
dependent: :destroy
has_many :following, -> { where(relationships: { state: "accepted" } ) }, through: :active_relationships, source: :followed
has_many :followers, through: :passive_relationships, source: :follower
has_many :pending_following, -> { where(relationships: { state: "pending" } ) }, through: :pending_relationships, source: :followed
отношения/декоратор:
class RelationshipDecorator < Draper::Decorator
delegate_all
decorates :relationship
def relationship_state
model.state.titleize
end
def sub_message
case model.state
when 'pending'
"Relationship request pending"
when 'accepted'
"You are now connected with #{model.followed.name}"
end
end
end
ИЗМЕНИТЬ:
БД/мигрировать:
class AddStateToRelationships < ActiveRecord::Migration
def change
add_column :relationships, :state, :string
add_index :relationships, :state
end
end
модель/отношения:
class Relationship < ActiveRecord::Base
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
validates :follower_id, presence: true
validates :followed_id, presence: true
after_destroy :delete_mutual_relationship!
state_machine :state, initial: :pending do
after_transition on: :accept, do: [:send_acceptance_email, :accept_mutual_relationship!]
state :requested
event :accept do
transition any => :accepted
end
end
вывод терминала:
Started POST "/relationships?relationship%5Bfollowed_id%5D=25" for 127.0.0.1 at 2014-11-06 16:35:26 +1100
Processing by RelationshipsController#create as JSON
Parameters: {"relationship"=>{"followed_id"=>"25"}}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 25]]
(0.1ms) begin transaction
SQL (5.4ms) INSERT INTO "relationships" ("created_at", "followed_id", "follower_id", "state", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-11-06 05:35:26.360104"], ["followed_id", 25], ["follower_id", 1], ["state", "pending"], ["updated_at", "2014-11-06 05:35:26.360104"]]
SQL (0.2ms) INSERT INTO "relationships" ("created_at", "followed_id", "follower_id", "state", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-11-06 05:35:26.368921"], ["followed_id", 1], ["follower_id", 25], ["state", "requested"], ["updated_at", "2014-11-06 05:35:26.368921"]]
Relationship Load (0.1ms) SELECT "relationships".* FROM "relationships" WHERE "relationships"."id" = ? LIMIT 1 [["id", 49]]
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]]
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 25]]
Rendered user_mailer/relationship_requested.html.erb (0.2ms)
UserMailer#relationship_requested: processed outbound mail in 27.9ms
Sent mail to [email protected] (14.2ms)
Date: Thu, 06 Nov 2014 16:35:26 +1100
From: [email protected]
To: [email protected]
Message-ID: <[email protected]>
Subject: Firstname Surname wants to follow you. Please log in to accept
this request
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Hi example-24,
Firstname Surname wants to follow you.
(7.7ms) commit transaction
Completed 200 OK in 71ms (Views: 0.3ms | ActiveRecord: 14.4ms)
что происходит, когда я (пользователь 1) ищу пример пользователя-24 (идентификатор пользователя = 25), а затем нажимаю кнопку «добавить отношение» (как показано в sqlitebrowser: (см. внизу изображения две строки, относящиеся к этому пример)
ИЗМЕНИТЬ:
пользователи/контроллер:
def create
if params[:relationship] && params[:relationship].has_key?(:followed_id)
@followed = User.find(params[:relationship][:followed_id])
# @followed = User.where(name: params[:relationship][:followed_id]).first
@relationship = Relationship.request(current_user, @followed)
respond_to do |format|
if @relationship.new_record?
format.html do
flash[:danger] = "There was a problem creating that relationship request"
redirect_to followed_path(@followed)
end
format.json { render json: @relationship.to_json, status: :precondition_failed }
else
format.html do
flash[:success] = "Friend request sent"
redirect_to followed_path(@followed)
end
format.json { render json: @relationship.to_json }
end
end
else
flash[:danger] = "Friend Required"
redirect_to users_path
end
end