【问题标题】:Ruby rails can't add user entryRuby rails 无法添加用户条目
【发布时间】:2015-04-30 01:57:23
【问题描述】:

一切似乎都很好,执行 user.save 时没有错误消息,但在索引时没有显示。

我运行了迁移:

class AddEmailToUsers < ActiveRecord::Migration
  def change
    add_column :email, :name, :password, :password_confirmation, :string
  end
end

models/user.rb

class User < ActiveRecord::Base
  #attr_accessor :remember_token
  attr_accessor :email
  attr_accessor :name
  attr_accessor :password_digest
  attr_accessor :password, :password_confirmation
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
 # has_secure_password
  validates :password, length: { minimum: 6 }

  # functions...
end

在创建时,我填写了一些示例值来测试它,它提交给views/users/create.html.erb,而“错误:[]”中没有显示任何内容,并且为@user的字段显示了正确的数据.

控制器/user_controller.rb

class UsersController < ApplicationController
  def new
    #require 'bcrypt'
    @user = User.new
  end

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

 def create
    #@user = User.new(user_params)
    @user = User.new(name: "di3", email:"di3@di3.com", password: "di3", password_confirmation: "di3")
    #@user = User.new(params[:user])
    if @user.save!
      log_in @user
      flash[:success] = "Welcome to the forum!"
      #redirect_to @user
      #redirect_to users_path
    else
      #render 'new'
      render @user.error_messages.full
    end
  end

  private

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

views/users/create.html.erb

<h1>Create user params</h1>

<%= render partial: 'layouts/header' %>

<table>
  <tr>
    <th>Email</th>
    <th>Name</th>
    <th>Password</th>
  </tr>

      <tr>
        <td><%= @user.email %></td>
        <td><%= @user.name %></td>
        <td><%= @user.password %></td>
        <td><%= @user.password_confirmation %></td>
      </tr>
</table>

<br/>

Error:

<%= @user.errors.full_messages %>

但是这个用户索引根本没有显示任何用户:

视图/用户/index.html.erb

<h1>Listing forums</h1>

<%= render partial: 'layouts/header' %>

<table>
  <tr>
    <th>Email</th>
    <th>Name</th>
    <th>Password</th>
    <th>Password</th>
    <th>Password</th>
  </tr>

  <% if(@users)
    @users.each do |user| %>
      <tr>
        <td><%= user.email %></td>
        <td><%= user.name %></td>
        <td><%= user.password_digest %></td>
        <td><%= user.password %></td>
        <td><%= user.password_confirmation %></td>
      </tr>
    <% end %>
  <% end %>
</table>

[编辑]

我运行了您的迁移 (marouenB),但现在当我为用户编制索引时它说:

ActiveRecord::PendingMigrationError 迁移正在等待。解决 这个问题,运行:bin/rake db:migrate RAILS_ENV=development

运行不会改变消息。

运行 rake db:migrate:status 显示:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20150328013052  ********** NO FILE **********
   up     20150330041328  Create model forums
   up     20150331165353  Add email to users
   up     20150404003549  Add password digest to users
  down    20150506210153  Add login to users

[编辑]

我不知道我对 db/migration 所做的任何更改都是永久性的。所以我通过重新创建具有相同日期戳的旧迁移文件来修复它。然后我不得不删除迁移中更改的内容,因为它已经在创建这些字段。我不得不

drop_table :users

因为它对所有这些 nil 字段都给出了错误。现在我有一个新问题,但这个问题已经解决了。

【问题讨论】:

  • 您确定迁移有效吗?另外,日志显示什么?
  • 你没有告诉 Rails 应该向哪个表添加列。

标签: ruby-on-rails ruby


【解决方案1】:

首先使用此命令打开 Rails 控制台:rails 控制台

然后检查数据库中存在的用户:users = User.all 如果存在用户 从索引视图中删除 if 条件行,不需要它并改用此代码。

<% @users.each do |user| %>
 <tr>
    <td><%= user.email %></td>
    <td><%= user.name %></td>
    <td><%= user.password_digest %></td>
    <td><%= user.password %></td>
    <td><%= user.password_confirmation %></td>
  </tr>
<% end %>

首先,您应该修复迁移。 Rails 提供了一种生成迁移的快捷方式,使用语法 AddXXToYY 后跟您的属性,其中 YY 是您的表名。因此,对于您的情况,请使用以下命令:

rails g migration AddLoginToUsers name:string email:string password:string

请注意,您不需要在数据库中添加密码确认,因此要测试此验证,请将其添加到您的用户模型中

validates :password, confirmation: true
validates :password_confirmation, presence: true

它将添加一个密码确认作为虚拟属性,仅用于验证。 现在您可以测试更改,但请注意最小密码长度为 6,因此您必须更改控制器内的用户测试数据或正常使用表单。最后检查,复制我在答案中发布的视图块。

【讨论】:

  • users = User.all 显示了很多创建的用户,但所有用户的 email = nil 并且没有名称或密码字段。添加到表中的字段是否取决于迁移名称(AddEmailToUsers)还是我写的不正确?
  • 我运行了你的迁移,但现在当我索引用户时它说:[检查上面编辑的消息]
  • 在添加迁移文件后首先运行此命令:“rake db:migrate”? ,对于您的情况,您似乎已经手动删除了一些迁移文件,并且从您的状态输出中我没有看到用户的迁移文件。一种可能有用的技巧是检查数据库中的 schema_migrations 表,而不是删除引用删除迁移文件的行。
【解决方案2】:

您似乎缺少分隔符:

<% if(@users) %>
  <% @users.each do |user| %>

实际上,我认为根本不需要if

【讨论】:

    【解决方案3】:

    您的创建操作存在问题。

     def create
       #@user = User.new(user_params)
       @user = User.new(name: "di3", email:"di3@di3.com", password: "di3", password_confirmation: "di3")
       #@user = User.new(params[:user])
       if @user.save!
         log_in @user
         flash[:success] = "Welcome to the forum!"
         #redirect_to @user
         #redirect_to users_path
       else
         #render 'new'
         render @user.error_messages.full
       end
     end
    
    1. 保存!如果@user 无效,将引发 ActiveRecord::RecordInvalid 异常而不是返回布尔值。 ruby if 会将其视为 true。
    2. 没有模板呈现或重定向。

    3. 如果你在 if 和 else 语句中添加“p @user.errors”,你会发现你的密码太短了。

    我想知道以下代码是否有效。如果有效,文档在哪里?谢谢。

    render @user.error_messages.full
    

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多