【问题标题】:Ajax form not rendering partialAjax 表单不呈现部分
【发布时间】:2014-12-23 21:19:49
【问题描述】:

我正在尝试实施关注/取消关注表单来创建/破坏用户与网站上的公司之间的关系。我在提交表单时呈现新的部分时遇到问题,将关系按钮从“关注”更改为“取消关注”

目前,我根据关系是否已经存在来渲染不同的部分:

`<% unless current_user.id == @company.user_id  %>
 <div id="#relationship">
    <% if current_user.following?(@company)  %>
      <%= render :partial => 'unfollow' %>
    <% else  %>
      <%= render :partial =>  'follow' %>
    <% end %>
  </div>
<% end %>`

下面的部分看起来像:

<%= form_for(current_user.relationships.build(followed_id: @company.id), remote: true) do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow",class: "btn-transparent btn-hollow btn-huge" %>
<% end %>

虽然取消关注部分看起来像:

<%= form_for(current_user.relationships.find_by(followed_id: @company.id), html: { method: :delete }, remote: true) do |f| %>
  <%= f.submit "Unfollow", class: "btn-transparent btn-hollow  btn-huge" %>
<% end %>

这些使用我的Relationships_Controller 中的Create 和Destroy 方法:

class RelationshipsController < ApplicationController
  before_filter :authenticate_user!

  def create
    @company = Company.find(params[:relationship][:followed_id])
    current_user.follow!(@company)
    respond_to do |format|
      format.html { redirect_to @company }
      format.js {render layout: false}
    end
  end

  def destroy
    @company = Relationship.find(params[:id]).followed
    current_user.unfollow!(@company)
    respond_to do |format|
      format.html { redirect_to @company }
      format.js{render layout: false}
    end
  end
end

如果我设置 remote: false,表单会按预期工作,创建和破坏关系,并且按钮会在页面重新加载时更改。当我尝试通过设置 remote: true 来使用 AJAX 时,并将以下代码用于关系/create.js.erb 和关系/destroy.js.erb

$("#relationship").html("<%= j render('companies/unfollow') %>");

$("#relationship").html("<%= j render('companies/follow') %>");

但是,现在当我重新加载页面时 - 我可以单击一次按钮来创建/销毁关系对象。如果我再次单击,我会收到 500 错误。永远不会加载新的部分。

虽然我有点菜鸟,但这个错误似乎指向我在 chrome 开发工具的 jquery 源代码中的这一行:

xhr.send( ( options.hasContent && options.data ) || null );

我正在使用 Rails 4、Jquery-Turbolinks 和 Devise——如果它们中的任何一个与问题有任何相关性的话。

现在非常沮丧,如果有人可以提供帮助,将不胜感激!

更新

日志输出如下。第一个 DELETE 说它已经呈现了我的部分,但它没有。第二次删除是第二次点击取消关注时发生的事情 - 它正确地指出与该 ID 号的关系不再存在,因为它在第一次操作时被删除。

Started DELETE "/relationships/429" for 127.0.0.1 at 2014-10-28 14:34:59 +0000
Processing by RelationshipsController#destroy as JS
  Parameters: {"utf8"=>"✓", "commit"=>"Unfollow", "id"=>"429"}
  [1m[36mUser Load (1.0ms)[0m  [1mSELECT  "users".* FROM "users"  WHERE "users"."id" = 1  ORDER BY "users"."id" ASC LIMIT 1[0m
  [1m[35mRelationship Load (0.4ms)[0m  SELECT  "relationships".* FROM "relationships"  WHERE "relationships"."id" = $1 LIMIT 1  [["id", 429]]
  [1m[36mCompany Load (0.3ms)[0m  [1mSELECT  "companies".* FROM "companies"  WHERE "companies"."id" = $1 LIMIT 1[0m  [["id", 1]]
  [1m[35mRelationship Load (0.3ms)[0m  SELECT  "relationships".* FROM "relationships"  WHERE "relationships"."follower_id" = $1 AND "relationships"."followed_id" = 1 LIMIT 1  [["follower_id", 1]]
  [1m[36m (0.2ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (3.6ms)[0m  DELETE FROM "relationships" WHERE "relationships"."id" = $1  [["id", 429]]
  [1m[36m (0.5ms)[0m  [1mCOMMIT[0m
  Rendered companies/_follow.html.erb (2.5ms)
  Rendered relationships/destroy.js.erb (5.3ms)
Completed 200 OK in 19ms (Views: 7.0ms | ActiveRecord: 6.3ms)


Started DELETE "/relationships/429" for 127.0.0.1 at 2014-10-28 14:35:04 +0000
Processing by RelationshipsController#destroy as JS
  Parameters: {"utf8"=>"✓", "commit"=>"Unfollow", "id"=>"429"}
  [1m[35mUser Load (0.9ms)[0m  SELECT  "users".* FROM "users"  WHERE "users"."id" = 1  ORDER BY "users"."id" ASC LIMIT 1
  [1m[36mRelationship Load (0.3ms)[0m  [1mSELECT  "relationships".* FROM "relationships"  WHERE "relationships"."id" = $1 LIMIT 1[0m  [["id", 429]]
Completed 404 Not Found in 4ms

ActiveRecord::RecordNotFound - Couldn't find Relationship with 'id'=429:

【问题讨论】:

  • 很高兴看到这个错误的控制台日志
  • 我不知道是不是这个,但看起来你在$("#relationship").html("&lt;%= j (render('companies/follow') %&gt;"); 中多了一个括号。如果这不是问题,控制台日志也会很棒。
  • 删除了括号,但它仍然无法正常工作 - 当我尝试很多事情时它卡在了那里。现在更新了日志输出。
  • 是的,在日志文件中与 id 429 的关系意味着我已经单击该按钮 429 次试图弄清楚这一点:(

标签: javascript jquery ruby-on-rails ajax


【解决方案1】:

您的 ID 名称中有一个哈希值。

尝试改变

<div id="#relationship">

到

<div id="relationship">

【讨论】:

    【解决方案2】:

    当使用remote: true你必须改变:

    format.js{render layout: false}
    

    与

    format.js
    

    否则:你永远不会渲染 relationships/create.js.erb 和 relationships/destroy.js.erb

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多