仅当用户与当前用户联系时才显示其个人资料

时间:2018-11-18 16:57:14

标签: ruby-on-rails ruby

我的用户控制器:

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 %>

2 个答案:

答案 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
  • 条件是一个赋值,要检查相等性,您需要使用`==
  • 您还需要检查列表中是否存在,@ contacts将是一个数组,并且永远不会等于列表的成员
  • 您还正在检查current_user是否为联系人,我认为您需要查找正在查看的用户

大概应该是这样的。我将把这个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