Невозможно получить доступ к current_user в контроллере для сохранения отношения - PullRequest
0 голосов
/ 26 марта 2020

У меня есть проект на Rails 6, я Citusdata / activerecord-multi-tenant gem , чтобы обрабатывать мой многопользовательский режим на основе строк. Я пытаюсь создать расписание для пользователя

Сейчас я не могу получить доступ к current_user, чтобы сохранить отношения. Мой вывод на консоль вообще не помогает:

Он связывает отношения с моделью учетной записи и автоматически сохраняет мой account_id, но не может собрать user.id или current_user.id

Я могу бросьте клоп в новые и создавайте блоки, однако, когда я пропускаю клоп ниже @time_sheet.save, он возвращается как ноль.

Я застрял здесь, не знаете, где я ошибаюсь? Я сделал это много в прошлом.

Вот как все это настроено:

class User < ApplicationRecord
  extend FriendlyId
  friendly_id :username, use: :slugged

  multi_tenant :account
  belongs_to :role

  has_many :time_sheets
end

class TimeSheet < ApplicationRecord
  multi_tenant :account
  belongs_to :user (user_id in schema)
end

class TimeSheetsController < ApplicationController
before_action :authenticate_user!

  def new
    @user = current_user
    @time_sheet = TimeSheet.new
  end

  def create
    @user = current_user
    @time_sheet = TimeSheet.new(time_sheet_params)

    respond_to do |format|
      if @time_sheet.save
        format.html { redirect_to @time_sheet, flash: { success: "#{@time_sheet.start_date} - #{@time_sheet.end_date} has been sucessfully created." } }
      else
        format.html { render :new }
      end
    end
  end

end

Моя новая форма расписания

<%= form_for(@time_sheet, :html => { class: "flex w-full items-center mt-64" }) do |f| %>
<% if @time_sheet.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@time_sheet.errors.count, "error") %> prohibited this user from being saved:</h2>

    <ul>
      <% @time_sheet.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
  <div class="w-full text-center">
    <p class="text-3xl text-primary-700 mb-16">New Time Sheet</p>
    <div class="flex flex-wrap w-full justify-center">
      <div class="w-1/4 mr-3">
        <%= f.label :start_date, "Start Date", class: 'form-label text-left' %>
        <%= f.date_field :start_date, class: 'form-input w-full' %>
      </div>
      <div class="w-1/4 ml-3">
        <%= f.label :end_date, "End Date", class: 'form-label text-left' %>
        <%= f.date_field :end_date, class: 'form-input w-full' %>
      </div>
    </div>
    <div class="flex w-full justify-center">
      <div class="w-1/4 mt-6">
        <%= f.submit "Start Period", class: "p-3 w-full bg-green-800" %>
      </div>
    </div>
  </div>
<% end %>

вывод моей консоли:

Started POST "/time_sheets" for 127.0.0.1 at 2020-03-26 09:43:34 -0600
Processing by TimeSheetsController#create as HTML
  Parameters: {"authenticity_token"=>"TuSzdfVr5iYqpvHfoPU+W7dFKQHCSX9cYcvbtqiqwdKOmaxhqQVp0inOjI0/NYuMpBoZPzJggJdeVro9XyV/lQ==", "time_sheet"=>{"start_date"=>"2020-03-26", "end_date"=>"2020-03-27"}, "commit"=>"Start Period"}
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:10:in `set_account_as_tenant'
  Account Load (0.3ms)  SELECT "accounts".* FROM "accounts" LIMIT $1  [["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:12:in `set_account_as_tenant'
Completed 422 Unprocessable Entity in 10ms (ActiveRecord: 1.1ms | Allocations: 3992)



ActiveRecord::RecordInvalid (Validation failed: User must exist):

app/controllers/time_sheets_controller.rb:21:in `block in create'
app/controllers/time_sheets_controller.rb:20:in `create'

1 Ответ

1 голос
/ 26 марта 2020

Похоже, что вы неправильно передаете user_id при создании time_sheet. Измените свой новый метод, добавив в него идентификатор current_user, добавив его в свои time_sheet_params, например:

@time_sheet = TimeSheet.new(time_sheet_params.merge(user_id: current_user.id)

...