我试图通过修改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
答案 0 :(得分:0)
我需要将控制器中的餐厅改为@restaurant。不知道为什么,但这有效。任何解释都会很酷!
答案 1 :(得分:0)
这是因为@restaurant
是类实例变量,因此它在您的视图中可用,但restaurant
是本地变量< / em>,仅在定义的方法(即动作)中可用。
您的观点会在<%= @restaurant.followers.count %>
中调用该变量,但由于您定义的是本地变量 restaurant
,因此您的视图无法使用它undefined method 'id' for nil:NilClass
错误; @restaurant
返回nil
而不是Restaurant
对象。
但是当您将其更改为@restaurant
时,您可以将其设置为您的视图,因此不再有nil
个值。