Создание экземпляра модели в контроллере возвращает ноль для id и метки времени Rails 6 - PullRequest
0 голосов
/ 08 июня 2019

Я сейчас пытаюсь создать photo в контроллере. Однако экземпляр не сохраняется. Я передаю правильные параметры, но не уверен, почему не сохраняется.

 18: def create
    19:   @photo = Photo.new(photo_params)
 => 20:   binding.pry
    21:   if @photo.save
    22:     redirect_to @photo
    23:   else
    24:     render "new"
    25:   end
    26: end

[1] pry(#<PhotosController>)> Photo.new(photo_params)
=> #<Photo:0x00007fefafb9b058 id: nil, user_id: nil, location: "New York", description: "something somethings", created_at: nil, updated_at: nil>

Как вы можете видеть выше, параметры передаются, но не id, и user_id также равен nil, это из-за ассоциации, которая не создается?

class PhotosController < ApplicationController
  def index
    @photos = Photo.all
  end

  def show
    @photo = Photo.find(params[:id])
  end

  def new
    @photo = Photo.new
  end

  def edit
    @photo = Photo.find(params[:id])
  end

  def create
    @photo = Photo.new(photo_params)
    if @photo.save
      redirect_to @photo
    else
      render "new"
    end
  end

  def update
    @photo = Photo.find(params[:id])
    respond_to do |format|
      if @photo.update(photo_params)
        format
          .html { redirect_to @photo, notice: 'Post was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  private

  def photo_params
    params.require(:photo).permit(
      :location,
      :description,
      :image,
    )
  end
end

Вот контроллер для фотографий. Вот и я новое создаю. В create я передаю параметры для создания фото. Интересно, должен ли я передать это от текущего пользователя из-за следующей ассоциации.

class Photo < ApplicationRecord
  has_one_attached :image
  belongs_to :user
end

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 :photos
  has_one :profile
  accepts_nested_attributes_for :profile
end

Здесь у меня есть следующие модели. У пользователя много фотографий, и фотография принадлежит ему.

class CreatePhotos < ActiveRecord::Migration[5.2]
  def change
    create_table :photos do |t|
      t.references :user, foreign_key: true
      t.string :location
      t.string :description

      t.timestamps
    end
  end
end

Что касается миграции фотографий. Я не думаю, что мне нужно добавлять :image в таблицу, поскольку ActiveStorage позаботится об этом методом has_one_attached. Не уверены в чем проблема?

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

В опциях по умолчанию из

belongs_to :user

требует, чтобы user_id был установлен в текущих версиях Rails. Поскольку вы не назначаете пользователя для новой фотографии, фотография не может быть сохранена.

Чтобы назначить текущего пользователя новой фотографии, просто измените эту строку

@photo = Photo.new(photo_params)

в вашем create методе в контроллере до

@photo = current_user.photos.build(photo_params)

Советую прочитать документы об ассоциации has_many в Руководствах по Rails.

0 голосов
/ 08 июня 2019

Ваш photo_params содержит только три значения:

    params.require(:photo).permit(
      :location,
      :description,
      :image,
    )

Это единственные значения, которые вы передаете Photo.new, так что это единственные поля, которые заполняются. Непонятно, почему вы ожидаете установить user_id, но поля id и created_at заполняются автоматически при save записи. Поставьте binding.pry после вашего save вызова.

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