ActionController :: ParameterMissing (параметр отсутствует или значение пустое: имя): - PullRequest
0 голосов
/ 20 мая 2018

При реализации того, что я считал простой signup/login системой для приложения Ruby on Rails, результаты не соответствовали тому, что показали учебники.

Я пытаюсь использовать bcrypt для аутентификации и PostgreSQL длябаза данных.

Я постоянно получаю 'ActionController::ParameterMissing (param is missing or the value is empty: name):', даже если имя будет отображаться как ввод.'"users"=>{"name"=>"asdf", "password"=>"Qq!1asdfasdf", "password_confirmation"=>"Qq!1asdfasdf"}, "commit"=>"Submit"} (0.1ms)

вывод с консоли при попытке входа в систему

пользователей контроллера

class UsersController < ApplicationController


def new
end

def create
  user = User.new(
    name: params[:name],
    password: params[:password],
    password_confirmation: params[:password_confirmation])
  if user.save
    session[:user_id] = user.id
    redirect_to '/'
  else
    redirect_to '/signup'
  end
end

private

end

Таблица

class UsersController < ApplicationController


def new
end

def create
  user = User.new(
    name: params[:name],
    password: params[:password],
    password_confirmation: params[:password_confirmation])
  if user.save
    session[:user_id] = user.id
    redirect_to '/'
  else
    redirect_to '/signup'
  end
end

private

end

и регистрационная форма

class UsersController < ApplicationController


def new
end

def create
  user = User.new(
    name: params[:name],
    password: params[:password],
    password_confirmation: params[:password_confirmation])
  if user.save
    session[:user_id] = user.id
    redirect_to '/'
  else
    redirect_to '/signup'
  end
end

private

end

модель пользователя

class User < ActiveRecord::Base


    PASSWORD_FORMAT = /\A
    (?=.{10,})          # Must contain 10 or more characters
    (?=.*\d)           # Must contain a digit
    (?=.*[a-z])        # Must contain a lower case character
    (?=.*[A-Z])        # Must contain an upper case character
    (?=.*[[:^alnum:]]) # Must contain a symbol
    /x

    #formatting for password

    USERNAME_FORMAT = /\A[a-z0-9A-Z\-_]{2,15}\z/ #Can contain lowercase and upercase letters, numbers, - and _, must be between 2 and 15 length

    #username formatting

    validates :name,
    :presence => true,
    :uniqueness => true,
    :format => USERNAME_FORMAT

    validates :password, 
    :presence => true, 
    :format => PASSWORD_FORMAT,
    :confirmation => true, 
    :on  => create 

  has_secure_password
end

Я пробовал troubleshooting, на все подобные вопросы не было получено ответа или исправления.

РЕДАКТИРОВАТЬ: больше ясности в вопросе

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Я думаю, что это проблема передачи данных между вашей формой и вашим контроллером.
В ваших журналах ваши параметры для пользователя выглядят так: "users"=>{"name"=> ...}, но это должно быть "user"

Для передачи данныхмежду вашим контроллером и вашим представлением вам нужно использовать переменную экземпляра, такую ​​как @user, чтобы сделать новый экземпляр User доступным в представлении.( source )

Таким образом, ваш контроллер должен быть:

def new
  @user = User.new
end

def create
  @user = User.new(user_params)
  if @user.save
    session[:user_id] = @user.id
    redirect_to '/'
  else
    redirect_to '/signup'
  end
end

private

def user_params
  params.require(:user).permit(:name, :password, :password_confirmation)
end

(с сильными параметрами, такими как объясненный @ fool-dev)

Тогдапо вашему мнению, используйте это @user для передачи параметров в контроллер:

<%= form_for @user do |f| %>
  //...the form
<% end %>
0 голосов
/ 20 мая 2018

Вам необходимо использовать рельсы Strong Parameter, как показано ниже

class UsersController < ApplicationController

    def new
    end

    def create
      user = User.new(user_params)
      if user.save
        session[:user_id] = user.id
        redirect_to root_path
      else
        redirect_to new_user_path
      end
    end

    private

    def user_params
        params.require(:user).permit(:name, :password, :password_confirmation)
    end

end
...