AJAX表单正确提交但未能刷新表单

时间:2017-04-21 00:43:32

标签: ruby-on-rails ajax

我试图通过修改Michael Hartl的书中的指南来添加推特式的Feed:https://www.railstutorial.org/book/following_users

有一个"关注"按钮应该变成"取消关注"按下时反之亦然。表单正在成功提交(如果我刷新页面,它会将按钮更改为正确的版本,并且正在数据库中创建关系),但是如果没有整页刷新,按钮就无法更改为正确的版本。 / p>

_follow_form.html.erb(由主视图页面部分加载)

<div id="follow_form">
  <% if current_user.following?(@restaurant) %>
    <%= render 'restaurants/unfollow' %>
  <% else %>
    <%= render 'restaurants/follow' %>
  <% end %>
</div>

_follow.html.erb(按关键)

<%= bootstrap_form_for(current_user.active_relationships.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :followed_id, @restaurant.id %></div>
  <%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>

_unfollow.html.erb(取消关注按钮)

<%= bootstrap_form_for(current_user.active_relationships.find_by(followed_id: @restaurant.id),
             html: { method: :delete }, remote: true) do |f| %>
  <%= f.submit "Unfollow", class: "btn" %>
<% end %>

相关控制器

class RelationshipsController < ApplicationController
  before_action :authenticate_user!

  def create
    restaurant = Restaurant.find(params[:followed_id])
    current_user.follow(restaurant)
    respond_to do |format|
      format.html { redirect_to @restaurant }
      format.js
    end    
  end
  def destroy
    restaurant = Relationship.find(params[:id]).followed
    current_user.unfollow(restaurant)
    respond_to do |format|
      format.html { redirect_to @restaurant }
      format.js
    end
  end
end

create.js.erb

$("#follow_form").html("<%= escape_javascript(render('restaurants/unfollow')) %>");
$("#followers").html('<%= @restaurant.followers.count %>');

destroy.js.erb

$("#follow_form").html("<%= escape_javascript(render('restaurants/follow')) %>");
$("#followers").html('<%= @restaurant.followers.count %>');

以下是我根据Chrome获得的错误:

NoMethodError in Relationships#destroy

Showing /home/ubuntu/workspace/suburblia/app/views/restaurants/_follow.html.erb where line #2 raised:
undefined method `id' for nil:NilClass
Trace of template inclusion: app/views/relationships/destroy.js.erb
Rails.root: /home/ubuntu/workspace/suburblia

2 个答案:

答案 0 :(得分:0)

我需要将控制器中的餐厅改为@restaurant。不知道为什么,但这有效。任何解释都会很酷!

答案 1 :(得分:0)

这是因为@restaurant类实例变量,因此它在您的视图中可用,但restaurant本地变量< / em>,仅在定义的方法(即动作)中可用。

您的观点会在<%= @restaurant.followers.count %>中调用该变量,但由于您定义的是本地变量 restaurant,因此您的视图无法使用它undefined method 'id' for nil:NilClass错误; @restaurant返回nil而不是Restaurant对象。

但是当您将其更改为@restaurant时,您可以将其设置为您的视图,因此不再有nil个值。