ajax не работает с jquery-rails

Я пытаюсь заставить кнопку изменить свое имя/действие после того, как пользователь нажмет на нее, но я не могу заставить Ajax работать. Кажется, это работает после обновления страницы. Я использую гем jquery-rails v.1.0.12. Контекст: я работаю с ассоциацией has_many :through: пользователи, которые хотят присоединиться к группам через членство — вот модели и некоторые пользовательские методы, которые используются позже:

class User < ActiveRecord::Base
 has_many :memberships
 has_many :groups, :through => :memberships
 has_many :groups_as_owner, :class_name => "Group"
.
.
.
  def member?(group)
    memberships.find_by_group_id(group)
  end

  def join!(group)
    memberships.create!(:group_id => group.id)
  end

  def leave!(group)
    memberships.find_by_group_id(group).destroy
  end
.
.
.
end

class Group < ActiveRecord::Base
 has_many :memberships
 has_many :members, :through => :memberships, :source => :user
 belongs_to :owner, :class_name => "User", :foreign_key => :user_id
 has_attached_file :photo, :styles => { :thumb => "100x100",
                                        :small => "200x200" }
 attr_accessible :name, :description, :private, :created_at, :group_id
 attr_accessible :photo, :photo_file_name, :photo_content_type,
                 :photo_file_size,  :photo_updated_at                                  
end

class Membership < ActiveRecord::Base
 attr_accessible :group_id
 belongs_to :user
 belongs_to :group
end

Вот контроллер членства:

class MembershipsController < ApplicationController
def create
  @group = Group.find(params[:membership][:group_id])
  current_user.join!(@group)
  respond_to do |format|
    format.html { redirect_to @group }
    format.js
  end
end

def destroy
   @group = Membership.find(params[:id]).group
   current_user.leave!(@group)
   respond_to do |format|
     format.html { redirect_to @group }
     format.js
   end
end

def index
  @memberships = Membership.all
end

end

Я пытаюсь реализовать кнопку «Присоединиться/Выйти», управляемую AJAX, для групп со следующим jquery: view/memberships/create.js.erb

$('#join_form').html("<%= escape_javascript(render('groups/leave')) %>");

просмотр/членство/destroy.js.erb

$('#join_form').html("<%= escape_javascript(render('groups/join')) %>");

приведенный выше jquery действует на партиал _join_form.html.erb, который отображается на странице группового показа:

  <div id="join-form">
    <% if current_user.member?(@group) %>
      <%= render 'leave' %>
    <% else %>
      <%= render 'join' %>
    <% end %>
  </div>

'выйти' частичный /groups/_leave.html.erb

<%= form_for current_user.memberships.find_by_group_id(@group),
         :html => { :method => :delete },
         :remote => true do |f| %>
  <div class="actions"><%= f.submit "Leave" %></div>
<% end %>

'присоединиться' частичный /groups/_join.html.erb

<%= form_for current_user.memberships.
                      build(:group_id => @group.id),
                      :remote => true do |f| %>
  <div><%= f.hidden_field :group_id %></div>
  <div class="actions"><%= f.submit "Join" %></div>
<% end %>

Вот мой вид/макет/application.html.erb, где я включаю различные вещи javascript:

<!DOCTYPE html>
<html>
<head>
  <title><%= title %></title>
  <%= javascript_include_tag :all %>
  <%= csrf_meta_tag %>
  <%= render 'layouts/stylesheets' %>

</head>
<body>
    <div class="container">
      <%= render 'layouts/header'%>
      <section class="round">
        <%= yield %>
      </section>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
    <%= javascript_include_tag 'jquery','jquery.min','rails.validations' %>
    <%= javascript_include_tag :all, :cache => true %>

</body>
</html>

Извините за объем кода, но я просто хотел быть тщательным, потому что кажется, что многие вопросы SO имеют слишком мало контекста. Если вам нужна дополнительная информация, я был бы рад предоставить больше. Я использую jquery, потому что с моей точки зрения новичка кажется, что прототип находится на исходе, а также я использую гем rails-validations, который требует jquery. Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы, так как я корпел над этим часами и не могу понять. Я поместил свои теги javascript ближе к концу моего макета приложения в соответствии с советом http://lindsaar.net/2010/5/9/Getting-Rails-3-Edge-with-jQuery-RSpec-и-Cucumber-using-RVM и 'вспомогательные' методы членства member?, присоединяйтесь! и уходите! адаптированы из руководства Майкла Хартла по Ruby on Rails по адресу http://ruby.railstutorial.org/chapters/. Спасибо, Брайан


person Brian    schedule 30.06.2011    source источник
comment
Я думаю, это из-за проблем с участником?, присоединяйся! и уходи! методы. Возня с консолью rails показала, что find_by_group_id не работает. Я только что создал db:migrate, чтобы добавить индексы для user_id и group_id в таблицу присоединения к членству, но find_by_group_id по-прежнему не работает.   -  person Brian    schedule 01.07.2011


Ответы (1)


попробуйте Membership.where( :group_id => group.id) или даже проще: group.memberships вместо вашего find_by_something.

find_by и т.п. вообще довольно медленные и ИМХО, нечистые.

Последнее обычно быстрее, но не забывайте всегда загружать ассоциации с Group.find(1).includes(:memberships), так как это значительно увеличивает производительность.

person Julian Bangert    schedule 01.07.2011
comment
метод member? работает в консоли. но не будет ли Membership.where( :group_id => group.id) проверять только наличие членства в этой группе, не обязательно членство, в котором участвует пользователь, о котором мы спрашиваем? По сути, это проверка того, есть ли в этой группе какое-либо членство, а не конкретное членство с определенными пользователями. - person Brian; 02.07.2011