Как исправить связь пользователя 1 со многими при получении NoMethodError "Неопределенный метод 'user_id', вы имели в виду? User" - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь реализовать модель User с ассоциацией 1-ко-многим со статьями.Таким образом, я добавил модель User.rb с

class User < ApplicationRecord
  has_many :articles
  before_save { self.email = email.downcase }
  validates :username, presence: true,
      uniqueness: { case_sensitive:  false },
      length: { minimum: 3, maximum: 25 }

  VALID_EMAIL_REGEX = /\A\S+@.+\.\S+\z/i
  validates :email, presence: true,
      uniqueness: { case_sensitive: false },
      length: { maximum: 105 }, format: { with: VALID_EMAIL_REGEX }
end

Также добавлен own_to: user в модели Article:

class Article < ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy

  validates :title, presence: true, length: { minimum: 5 }
  validates :text, presence: true, length: { minimum: 10, maximum: 400}
  validates :user_id, presence: true
end

Я запустил эту миграцию

рельсы генерируют миграцию add_user_id_to_articles

и это мой файл миграции

class AddUserIdToArticles < ActiveRecord::Migration[5.2]
  def change
    add_column :articles, :user_id, :integer
  end
end

Вот определение моей схемы.rb:

ActiveRecord::Schema.define(version: 2019_02_26_124924) do
  create_table "articles", force: :cascade do |t|
    t.string "title"
    t.text "text"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "comments", force: :cascade do |t|
    t.string "commenter"
    t.text "body"
    t.integer "article_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["article_id"], name: "index_comments_on_article_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "username"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

И, наконец, мойФункция изменения в файле article_controller.rb:

def create
  @article = Article.new(article_params)
  if @article.save
    redirect_to @article
  else
    render 'new'
  end
end

Я запустил rails db: migrate, так что проблем не должно быть.Я видел, как некоторые люди в Stackoverflow говорят, что я должен просто добавить

@article.user_id = current_user.id

, но уже сделал это, и ничего не произошло.

Я получаю эту ошибку:

NoMethodError (неопределенный метод `user_id 'для #) Вы имели в виду?пользователь

и я не знаю, что еще попробовать.Я начинаю с Ruby on Rails, так что имейте это в виду.

Большое спасибо за чтение, надеюсь, кто-нибудь знает исправление.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Внутри вашего контроллера Articles вам нужно добавить user_id в ваши разрешенные параметры.

def article_params
  params.require(:article).permit(:title, :text, :user_id)
end
0 голосов
/ 26 февраля 2019

Во-первых, убедитесь, что ваша миграция действительно проходит;тогда ваш schema.rb должен также включать столбец user_id.

Затем попробуйте изменить строку, создающую новую статью, на:

@article = current_user.articles.new(article_params)

В качестве альтернативы, вы можете установить

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