Как отобразить значение переменной сеанса в Ruby / Rails? - PullRequest
0 голосов
/ 24 апреля 2020

Сначала я не знаю, правильно ли я объявляю переменную сеанса. Кроме того, я поместил его в контроллер приложения, потому что я знаю, что он будет работать. Если есть лучшее место для этого, пожалуйста, дайте мне знать. Желаемый результат - пользователь выбирает команду, в которую он хочет сохранить всю свою работу во время сеанса. Затем, когда объекты сохраняются, они используют переменную сеанса: current_team вместо: current_user. По умолчанию при создании команда будет создаваться для каждого нового пользователя. Вот почему я запрашиваю первую команду для каждого пользователя. Во время сеанса я планирую, чтобы пользователь выбрал команду, в которой он работает / участвует, и выбор будет продолжаться до тех пор, пока он не изменит его.

application_controller.rb

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :set_current_team

  def set_current_team
    return unless session[:current_team]
    session[:current_team] = Team.first.where(user_id: current_user).id
  end


end

index. html .erb

<p><%= session[:current_team] %></p>

output

Processing by PagesController#index as HTML
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /home/dev/.rbenv/versions/2.5.2/lib/ruby/gems/2.5.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
  Rendering pages/index.html.erb within layouts/application
  Rendered pages/index.html.erb within layouts/application (0.5ms)
  Rendered shared/_navigation.html.erb (2.9ms)
Completed 200 OK in 172ms (Views: 168.3ms | ActiveRecord: 0.4ms)

Мои модели: Team, User и таблица соединения Team_member. team_member.rb

  belongs_to :user
  belongs_to :team
  belongs_to :role
end

team.rb

  has_many :team_members
  has_many :users, through: :team_members
  has_many :roles, through: :team_members
end

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Я предполагаю, что один пользователь может быть частью нескольких команд, и (очевидно) одна команда имеет много пользователей, ваши отношения будут примерно такими:

class User < ApplicationRecord
  has_and_belongs_to_many :teams
end

class Team < ApplicationRecord
  has_and_belongs_to_many :users
end

Вы уже в правильном направлении, но я мало что изменил в set_current_team и добавлен метод доступа для получения текущего экземпляра команды.

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :set_current_team

  helper_method :current_team

  def set_current_team
    return unless session[:current_team]
    session[:current_team] = current_user.teams.first.id
  end

  def current_team
    @_team ||= Team.find(session[:current_team])
  end
end

В методе current_team используется метод запоминания для кэширования текущей команды во время запроса, так что если вы вызываете current_team несколько раз в течение запрос, он не будет вызывать DB снова, чтобы получить отчет команды.

Я настоятельно рекомендую прочитать эту статью 4 Простые шаблоны памятки в Ruby.

Также обратите внимание на макрос helper_method над set_current_team, который делает этот вспомогательный метод доступным и для вашего представления.

, поэтому следующее будет работать для вашего индекса

<p><%= current_team %></p>

, а также для всех контроллеры, поскольку все контроллеры наследуются от ApplicationController

1 голос
/ 24 апреля 2020

Получив session[:current_team], вы можете сохранить его в переменной на любом контроллере. Скажем, например, в контроллере команд вы можете сделать: @current_team = session[:current_team]. Тогда в представлении вы можете использовать @current_team.

0 голосов
/ 24 апреля 2020

обновить set_current_team метод до

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :set_current_team

  # only set the session[:current_team] if it is nil (when user login)
  def set_current_team
    session[:current_team] ||= current_user.teams.first.id
  end

  # to access current_team
  def current_team
    @current_team ||= Team.find(session[:current_team])
  end
end

установить session[:current_team] для выбранного пользователем идентификатора команды в controller # action , который обрабатывает запрос

set session[:current_team] до nil при выходе пользователя из системы

...