我的用户控制器:
class UsersController < ApplicationController
before_action :is_contact, only: [:show]
def index
@contacts = User.joins(:groups)
.where(groups: {id: current_user.groups})
.where.not(id: current_user).uniq
end
def show
end
private
def is_contact
user = User.find(current_user.id)
if user = !@contacts
flash[:alert] = "Sorry, you don't know each other."
redirect_to root_path
end
end
end
我的联系人视图,您可以在其中发送消息(工作)或查看个人资料(不工作):
<% @contacts.each do |contact| %>
<h3><%= contact.name %></h3>
<%= link_to 'view profile', user_path(contact), class: "btn"
<% end %>
答案 0 :(得分:1)
似乎您错过了@contacts
是一个实例变量,并且并未在请求之间共享。基本上,当您尝试查看方法is_contact
中是否有联系人时,@contacts
变量为nil。
显示和索引是2个不同的请求。当您访问索引页面@contacts
时,已经创建了变量,但是当您单击索引页面上的用户链接时,就会发出另一个显示操作的请求,并且在该请求中您没有为之设置数据index
个动作。您需要进行数据库查询才能单独获取联系人以进行表演操作。
class UsersController < ApplicationController
before_action :contacts, only: %i[index show]
before_action :is_contact, only: [:show]
def index; end
def show; end
private
def contacts
@contacts ||= User.joins(:groups)
.where(groups: {id: current_user.groups})
.where.not(id: current_user).uniq
end
def is_contact
user = User.find(params[:id)
unless @contacts.detect { |contact| contact.id == user.id }
flash[:alert] = "Sorry, you don't know each other."
redirect_to root_path
end
end
end
答案 1 :(得分:0)
def is_contact
user = User.find(current_user.id)
if user = !@contacts
大概应该是这样的。我将把这个is_contact签出到一个普通的红宝石对象中,以便使概念清晰并位于控制器外部。
def is_contact
viewed_user = User.find(params[:id])
viewed_user_is_contact = @contacts.any? {|contact| contact == user}
if !viewed_user_is_contact
#flash