Ruby on rails NoMethodError at/members未定义方法'friend#u id';零级:零级
现在我尝试在我的用户索引页面上添加“follow button” 我的目标是。。。当用户按下按钮一次时,按钮旁边的消息将变为“following”。当他或她再次按下按钮时,信息变为“不跟随”。默认消息为“不遵循” 然后我写了下面的代码,但收到一条错误消息。你能告诉我如何解决这个问题吗Ruby on rails NoMethodError at/members未定义方法'friend#u id';零级:零级,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.2,现在我尝试在我的用户索引页面上添加“follow button” 我的目标是。。。当用户按下按钮一次时,按钮旁边的消息将变为“following”。当他或她再次按下按钮时,信息变为“不跟随”。默认消息为“不遵循” 然后我写了下面的代码,但收到一条错误消息。你能告诉我如何解决这个问题吗 NoMethodError at /members undefined method `friend_id' for nil:NilClass ☆index.html.erb(成员和控制器) ☆会话\控制器\会话
NoMethodError at /members undefined method `friend_id' for nil:NilClass
☆index.html.erb(成员和控制器)
☆会话\控制器\会话[:用户\ id]
auth = request.env["omniauth.auth"]
member = Member.find_by_provider_and_uid(auth["provider"], auth["uid"])
session[:user_id] = member.id
这里的问题是索引操作中的实例var@isFr返回nil。这意味着代码
Friend.where(:member\u id=>session[:user\u id],:Friend\u id=>m.id)。首先返回nil
您可以在members#index视图中执行
,这样您就不会得到命名错误
我在您的索引操作中发现以下代码有问题:
@members.each do |m|
@isFr = Friend.where(:member_id => session[:user_id], :friend_id => m.id ).first
end
上面代码的问题是@isFr将只保留@members数组中最后一个元素的值。最好在成员模型中为该行为添加一个方法,如下所示:
#in app/models/friend.rb
scope :get_member_id, ->(member, user_id) { where(:member_id => user_id, :friend_id => member.id ).first.try(:friend_id) }
然后在视图中使用它,如:
<% unless session[:user_id] == member.id %> # below this line of code
<% if Friend.get_member_id(member, session[:user_id]) == member.id %>
#在这行代码下面
希望这有帮助 下面的查询必须返回空AR
@members = Member.where("id >=1")
.order("created_at desc")
.paginate(:page => params[:page], :per_page => 10).scoped
而@isFr
最终会导致nil
@members.each do |m|
@isFr = Friend.where(:member_id => session[:user_id], :friend_id =>
m.id ).first
end
只要一句你能做的重构的话
Friend.where(:member\u id=>session[:user\u id],:Friend\u id=>@members.map(&:id)).limit(1)
但是如果你考虑一下你的模型之间的差异会更好。这样,它将通过连接查询进行优化感谢那些给我提示的人,我用下面的代码实现了它
☆index.html.erb(成员和控制器)
为什么条件where('id>=1')
?它是所有项目的一种替代品。感谢您的评论。我按照您的指示操作,但遇到了一条错误消息。#的未定义方法'friend_id',我检查了@isFr的内容。>>@isFr=>[#]这是数组?谢谢您的评论。我按照您的指示操作,但收到一条错误消息。NoMethodError at/members未定义的方法'friend\u id'for#。成员模型没有friend\u id列。但是会员上有很多朋友。对于我之前的错误,我深表歉意。我已经编辑了我的答案。希望这次能成功!非常感谢你。但是我在按照你的指令修改代码后遇到了这个问题。/members语法错误,意外的tLAMBDA,应为关键字\u end>>Friend!!#{where(:member\u id=>session……^>很抱歉!声明lambda时,正确的格式是->(member){where(:member\u id=>session[:user\u id],:friend\u id=>member.id.)。首先,尝试(:friend\u id)}
。我已经编辑了我的代码以反映这一更正。:)再次感谢。更正后,我在#的/members undefined local variable或方法'session'中得到了这个.NameError。您能告诉我如何解决这个问题吗?
@members = Member.where("id >=1")
.order("created_at desc")
.paginate(:page => params[:page], :per_page => 10).scoped
@members.each do |m|
@isFr = Friend.where(:member_id => session[:user_id], :friend_id =>
m.id ).first
end
<td>
<div class="onoff">
<% unless session[:user_id] == member.id %>
<% if @Frids.include? member.id%>
<%= link_to'Off', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-warning"%><br/>
※既follow
<% else %>
<%= link_to'On', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-primary"%><br/>
※未follow
<% end %>
<% end %>
</div>
<%#= member.friends.count %>
</td>
def index
if !checklogin? then return end
@members = Member.where("id >=1").order("created_at desc").paginate(:page => params[:page], :per_page => 10).scoped
if Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).exists? then
Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).each do |f|
f.destroy
end
else
Friend.new({:member_id => session[:user_id], :friend_id =>params[:id].to_i}).save
end
@Frids =Friend.where(:member_id => session[:user_id]).map{|x| x.friend_id}
respond_to do |format|
format.html # index.html.erb
format.json
end
end