2011-06-30 74 views
0

我想要一個按鈕來更改它的名稱/操作後用戶點擊它,但我不能讓Ajax工作。我刷新頁面後似乎工作。我使用的是jquery-rails gem v.1.0.12。 語境: 我用的has_many工作:通過關聯:用戶誰想要加入羣組通過成員─這裏的模型和一些用戶的方法,以後用於:ajax不能用jquery-rails

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組: 視圖/會員/ create.js.erb

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

視圖/成員/ destroy.js.erb

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

上述行爲jquery的上_joi​​n_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,因爲它似乎對我的初學者來說,原型正在出路,並且我正在使用需要jquery的rails驗證gem。請讓我知道,如果你看到任何問題,我已經仔細研究了幾個小時,並無法弄清楚。我按照http://lindsaar.net/2010/5/9/Getting-Rails-3-Edge-with-jQuery-RSpec-and-Cucumber-using-RVM的建議和成員的'helper'方法成員?,加入!,並離開!我的JavaScript標籤接近我的應用程序佈局的末尾!改編自邁克爾·哈特爾的Ruby on Rails的教程在http://ruby.railstutorial.org/chapters/ 謝謝, 布賴恩

+0

我認爲這是因爲會員有問題,加入!,並離開!方法。與鐵軌控制檯混淆發現,find_by_group_id不起作用。我剛剛創建了一個db:migrate來爲成員加入表中的user_id和group_id添加索引,但find_by_group_id仍然不起作用 – Brian

回答

0

嘗試 Membership.where(:group_id => group.id) 甚至傻笑: group.memberships ,而不是你find_by_something。

find_by,等等一般都比較慢,恕我直言,不潔。

後者通常速度更快,但一定要始終急切地加載與Group.find(1).includes(:memberships)的關聯,因爲這會顯着提高性能。

+0

'member?'方法在控制檯中工作。但不會'Membership.where(:group_id =>組。ID)「只驗證該組的成員資格的存在,而不一定是涉及我們詢問的用戶的成員資格?它基本上檢查該組是否具有任何成員資格,而不是具有特定用戶的特定成員資格。 – Brian