首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ajax不适用于jquery-rails

ajax不适用于jquery-rails
EN

Stack Overflow用户
提问于 2011-06-30 13:26:28
回答 1查看 723关注 0票数 0

我试图让一个按钮在用户单击后更改其名称/操作,但我无法让Ajax工作。在我刷新页面后,它似乎起作用了。我使用的是jquery-rails gem v.1.0.12。上下文:我正在使用has_many :通过关联:希望通过成员加入组的用户-这里是模型,以及稍后使用的一些用户方法:

代码语言:javascript
复制
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

以下是成员资格控制器:

代码语言:javascript
复制
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

我正在尝试为具有以下jquery的组实现一个AJAX控制的加入/离开按钮: view/memberships/create.js.erb

代码语言:javascript
复制
$('#join_form').html("<%= escape_javascript(render('groups/leave')) %>");

view/memberships/destroy.js.erb

代码语言:javascript
复制
$('#join_form').html("<%= escape_javascript(render('groups/join')) %>");

上面的jquery作用于显示在组显示页面上的_join_form.html.erb部分:

代码语言:javascript
复制
  <div id="join-form">
    <% if current_user.member?(@group) %>
      <%= render 'leave' %>
    <% else %>
      <%= render 'join' %>
    <% end %>
  </div>

‘'leave’部分/groups/_leave.html.erb

代码语言:javascript
复制
<%= 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 %>

‘'join’partial /groups/_join.html.erb

代码语言:javascript
复制
<%= 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 %>

下面是我的view/layout/application.html.erb,其中包含了各种javascript内容:

代码语言: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>

很抱歉代码量太大,但我只是想彻底了解一下,因为它似乎有很多问题,所以上下文太少。如果你想要更多的信息,我很乐意提供更多。我之所以使用jquery,是因为在我的初学者看来,prototype已经过时了,而且我正在使用一个需要jquery的rails-validations gem。如果你发现任何问题,请让我知道,因为我已经研究了几个小时了,还不能解决它。根据http://lindsaar.net/2010/5/9/Getting-Rails-3-Edge-with-jQuery-RSpec-and-Cucumber-using-RVM和成员资格“助手”方法的建议,我将javascript标记放在应用程序布局的末尾,加入!然后离开!改编自Michael Hartl在http://ruby.railstutorial.org/chapters/的Ruby on Rails教程谢谢,Brian

EN

回答 1

Stack Overflow用户

发布于 2011-07-02 07:08:55

Membership.where( :group_id => group.id)或者simper:group.memberships代替你的find_by_something。

find_by等一般都相当慢,而且不干净。

后者通常更快,但一定要始终与Group.find(1).includes(:memberships)关联,因为这会极大地提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6530289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档