Home > Blockchain >  Error in the form because of the relationship of the models
Error in the form because of the relationship of the models

Time:07-27

I created the user model with the devise generator. I also created the Profile model with the command rails -g scaffold... I made a relationship between the two. The problem is that I can't create a profile because there is a user field. I want the value to be automatically bound in the controller, without using the view.

Form

Model User:

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

   has_one :profile

end

Model Profile:

class Profile < ApplicationRecord
  belongs_to :user
end

User Migration:

# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
       t.integer  :sign_in_count, default: 0, null: false
       t.datetime :current_sign_in_at
       t.datetime :last_sign_in_at
       t.string   :current_sign_in_ip
       t.string   :last_sign_in_ip

      ## Confirmable
       t.string   :confirmation_token
       t.datetime :confirmed_at
       t.datetime :confirmation_sent_at
       t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
       t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
       t.string   :unlock_token # Only if unlock strategy is :email or :both
       t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
     add_index :users, :confirmation_token,   unique: true
     add_index :users, :unlock_token,         unique: true
  end
end

Profile Migration:

class CreateProfiles < ActiveRecord::Migration[7.0]
  def change
    create_table :profiles do |t|
      t.string  :name, limit: 32
      t.integer :age, index: true
      t.string  :sex, index: true
      t.string  :country, index: true
      t.string  :subdivision, index: true
      t.string  :city, index: true
      t.string  :neighborhood, index: true
      t.text    :about_me
      t.string  :conditions, limit: 140, index: true
   
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end

  add_index :profiles, :name,        unique: true 

  end
end

The lines of _form.html.erb corresponding to the user field:

 <div>
    <%= form.label :user_id, style: "display: block" %>
    <%= form.text_field :user_id %>
  </div>

Automatically translated.

CodePudding user response:

You missed user_id field when create Profile

ProfilesControler

before_action :authenticate_user!

def create
   profile = Profile.new(profile_params.merge(user_id: current_user.id))
end

Or

In _form.html.erb, you missed value: current_user.id

 <div>
    <%= form.label :user_id, style: "display: block" %>
    <%= form.text_field :user_id, value: current_user.id %>
  </div>

You check again. Thank you.

  • Related