Не удалось найти пользователя без идентификатора, даже когда @user с params создан - PullRequest
0 голосов
/ 05 июля 2019

Я создал приложение Rails с Devise.

Каждый пользователь должен иметь возможность отвечать на форму, которая заполняет модель Questionone.Тем не менее, я продолжаю получать Couldn't find User without an ID

Что я сделал: rails generate scaffold Questionone first_question:text second_question:text user:references

В моем User.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :questionones
end

В моем Questionone.rb У меня есть:

class Questionone < ApplicationRecord
  belongs_to :user
end

В моих questiones_controllers

before_action :set_questionone, only: [:show, :edit, :update, :destroy]

  def new
    @questionone = Questionone.new
    @user = User.find(params[:user_id])
    #If I use @user = current_user.id it works, but not sure if is right way
  end

  def create
    @questionone = Questionone.new(questionone_params)
    @questionone.user = User.find(params[:user_id])
    @questionone.save
  end
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_questionone
      @questionone = Questionone.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def questionone_params
      params.require(:questionone).permit(:user_id, :first_question, :second_question)
    end
end

Если я использую raise, он говорит мне, что@user is nil

ЕСЛИ Я ИСПОЛЬЗУЮ @user = current_user.id , это работает, но я не уверен, что это правильный путь

1 Ответ

2 голосов
/ 05 июля 2019

Немного неисправной логики. Вот ответ:

  def new
    @questionone = Questionone.new
    @user = current_user
  end

  def create
    @questionone = Questionone.new(questionone_params)
    @questionone.user = current_user
    @questionone.save
  end

Кроме того, вы не запоминаете Вопросон (странное имя: D), вы должны сделать это так:

def set_questionone
  @questionone ||= Questionone.find(params[:id])
end

Более длинный ответ: Я считаю, что область действия пользователя должна быть ограничена той, которая в данный момент является логином. Если это так, то вы представляете серьезную проблему безопасности, в которой любой может создавать вопросы, нажимая user_id в параметрах.

Полностью удалите параметр user_id и используйте переменную current_user.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...