Получение NotNullViolation при передаче данных через simple_form_for в Rails - PullRequest
0 голосов
/ 12 ноября 2018

Я получаю вышеуказанную ошибку при передаче данных через simple_form_for . Мой вид, контроллер и файл базы данных включены ниже. Похоже, я не получаю значения, представленные simple_form_for в контроллере. Обратите внимание, что в моей таблице базы данных атрибут status равен not null, и я не принимаю его в качестве входных данных. Как я могу решить эту ошибку?

База данных

create_table "users", force: :cascade do |t|
t.integer "team_lead_id"
t.string "name", null: false
t.string "email", null: false
t.string "password", null: false
t.date "joining_date", null: false
t.integer "status", null: false
t.integer "role"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

Просмотр

<%= simple_form_for @user , :url => user_createUser_url, :method => :post do |f| %>
    <%= f.input :name %><br />
    <%= f.input :email%><br />
    <%= f.input :password %><br />
    <%= f.input :joining_date, as: :date, order: [:day, :month, :year] %><br/>
    <%= f.submit "Create User" %>
  <% end %>

Контроллер

def createUser

    fresh = User.new

    fresh.name = params[:name]
    fresh.email = params[:email]
    fresh.password = params[:password]
    fresh.joining_date = params[:joining_date]
    fresh.status = 1
    fresh.role = 3

    if fresh.save
      flash[:notice] = "User Created"
      redirect_to(:action => index)
    else
      flash[:notice] = "Creating failed"
      redirect_to(:action => index)
    end

  end

И я получаю эту ошибку

PG::NotNullViolation: ERROR: null value in column "name" violates not-null constraint DETAIL: Failing row contains (12, null, null, null, null, null, 1, 3, 2018-11-12 13:37:54.589835, 2018-11-12 13:37:54.589835). : INSERT INTO "users" ("status", "role", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"

1 Ответ

0 голосов
/ 12 ноября 2018

createUser не является соглашением CRUD, вместо этого используйте create, но вы также должны использовать строгие параметры , а также не использовать глупые имена, такие как fresh, но вместо этого должны называться объекты моделейсемантически.

def create
  user = User.new(permitted_params)
  user.status = 1
  user.role = 3

  if user.save
    flash[:notice] = "User Created"
      redirect_to(:action => index)
  else
    flash[:notice] = "Creating failed"
    redirect_to(:action => index)
  end
end

def permitted_params
  params.require(:user).permit(:name, :email, :password, :joining_date)
end

Возможно, вам не понадобится joining_date, поскольку у вас есть created_at, но если вы хотите сохранить это поле, по крайней мере, используйте имя joined_date или join_date, так как оновсегда будет в прошедшем времени.Фактически, пользователь никогда не «присоединяется», он либо присоединился, либо еще не присоединился.

В качестве примечания вы никогда не должны хранить пароли в незашифрованном виде, возможно, смотрите bcrypt

...