RAILS: 不同的用户在视图中显示相同的内容时应该不同

RAILS: Separate users displaying the same content in view when should be different

我正在制作一个组织者网站,人们可以在其中组织他们的客户、项目等。但我遇到了技术挑战,我似乎还不知道如何解决(还)。

我的目标:

不同的用户生活在他们自己的世界中,他们在那里创建自己的客户端,当他们登录并导航到客户端页面时,这些客户端会显示在他们的客户端页面上。

当前挑战

通过 Faker gem 为单独的用户播种数据库后,当他们导航到客户页面时,单独的用户当前在索引视图中显示相同的客户列表,而我希望他们有不同的列出的字符串(代表不同的客户端)

我试过的

我目前正在调整 RailsTutorial.org Chp11: Micropost Guide 以适应我的客户端场景,并尝试在客户端控制器中创建 SHOW 和 INDEX 函数,但对整个 GET/POST 和控制器操作仍然相当模糊现场,这是我认为我遇到技术障碍的地方。

我的代码:

Routes.rb

  get 'password_resets/newedit'

  root              'static_pages#home'
  get 'about' =>    'static_pages#about'
  get 'signup' =>   'users#new'

  get 'login' =>    'sessions#new'
  #the page for new session
  post 'login' =>   'sessions#create'
  #creates a new session
  delete 'logout' =>'sessions#destroy'
  #deletes the session
  get 'clients' => 'clients#show'

  resources :users
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]
end

Clients.html.erb

<%= provide(:title, 'Clients') %>

<div class="clients-container container"> 
    <div class="row">
        <!-- Add pagination later for multiple folders over multiple pages --> 
    <% if @user.clients.any? %>
        <%= render @clients %> 
        <!-- render produces the following code: 
            from the partial file;

            <div class="col-md-2 client-folder" style="margin: 10px" id="client - <%= client.id %>">
            <span class="clientName" ><%= client.client_name %></span> <br>
            <span class="contactName"><%= client.contact_name %></span>
            </div>
        -->

        <%= will_paginate @microposts %>
    <% end %>
    </div>
</div>

Clients_controller.rb

class ClientsController < ApplicationController

    def show
        @user = current_user
        @clients = @user.clients.paginate(page: params[:page])
    end 
end

User_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user, only:    [:edit, :update] #restricted areas
  before_action :admin_user,   only: :destroy

  def index
    @users = User.paginate(page: params[:page])
  end 

  def show 
    @user = User.find(params[:id])
  end 

  def new
    @user = User.new
    render :layout => 'signup.html.erb'
  end

  def create
    @user = User.new(user_params)
    if @user.save
      @user.send_activation_email
      UserMailer.account_activation(@user).deliver_now
      flash[:success] = "Welcome to focus. Please check your e-mail to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end 

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      #Handle a successful update.
      flash[:success] = "Your information has been updated."
      redirect_to @user
    else
      render 'edit'
    end 
  end 

  def destroy
    User.find(params[:id]).destroy # destroys users
    flash[:success] = "Users deleted"
    redirect_to users_url
  end 
  private 

    #Confirms a  logged-in user. 
    def logged_in_user
      unless logged_in?
        store_location
        #While false...
        flash[:danger] = "Please log in."
        redirect_to login_url
      end 
    end 

    #Confirms the correct user.
    def correct_user
      @user=User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
        #If another user gets access to one user's id#
        #Rails gets the user profile id and tests it 
        #against the id of User logged in current 
    end     

    def user_params
      # 'strong parameter' to prevent mass assignment vulnerability 
      # user_params privatize to limits external exposure
      params.require(:user).permit(:name,:email,
                                   :password,:password_confirmation)
    end 

    # Confirms admin user 
    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end 
end

部分:seed.db

users = User.order(:created_at).take(3)
50.times do
    client_name = Faker::Lorem.characters(10)
    contact_name = Faker::Lorem.characters(10)
    contact_email = Faker::Lorem.characters(10)
    contact_phone = Faker::Lorem.characters(10)
    client_address = Faker::Lorem.characters(10)
    users.each { |user| user.clients.create!(client_name: client_name,
                                             contact_name: contact_name,
                                             contact_email: contact_email,
                                             contact_phone: contact_phone,
                                             client_address: client_address) }
    end

如果您能指出我在技术上没有看到的内容,我们将不胜感激!

编辑;我希望额外的图片可以帮助:

编辑 2: 由于@GoGoCarl 的输入,为可能发现有用的任何人附加最终工作代码:

users = User.order(:created_at).take(3)
50.times do
    users.each { |user| 
    client_name = Faker::Lorem.characters(10)
    contact_name = Faker::Lorem.characters(10)
    contact_email = Faker::Lorem.characters(10)
    contact_phone = Faker::Lorem.characters(10)
    client_address = Faker::Lorem.characters(10)

    user.clients.create!(client_name: client_name,
                                             contact_name: contact_name,
                                             contact_email: contact_email,
                                             contact_phone: contact_phone,
                                             client_address: client_address) }

    end 

您的播种循环需要反转。您正在创建 50 个客户,并且对于每个组,您迭代用户并添加客户。这意味着每个用户都将获得同一组客户端。 ID 不同,但外观(字段名称)相同。三个用户中的每一个都会获得一个具有给定预设属性(姓名、电子邮件等)的客户端

相反,反转循环;首先遍历每个用户,然后为每个用户创建 50 个客户端,并将这 50 个客户端添加到该用户。

现在,您的所有客户都应该彼此不同,而不是共享相同的字段。

注意:如果您不分配变量,此循环也可以工作,只需执行以下操作:


user.clients.create!(client_name: Faker::Lorem.characters(10),
  contact_name: Faker::Lorem.characters(10),
  contact_email: Faker::Lorem.characters(10),
  contact_phone: Faker::Lorem.characters(10),
  client_address: Faker::Lorem.characters(10))

然后,每次调用 create 时,都会生成一组新的随机字符。不过,我认为反转循环会使代码更明显。但是,那都是相对的!