Ruby rails无法添加用户条目

时间:2015-04-30 01:57:24

标签: ruby-on-rails ruby

一切似乎都很好,并且在执行user.save时没有错误消息,但在索引时它并没有出现。

我进行了迁移:

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

模型/ 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而不会显示任何内容&#34;错误:[]&#34;以及@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

视图/用户/ 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>

[edit]

我运行了您的迁移(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字段提供了错误。现在我有了一个新问题,但这个问题已经解决了。

3 个答案:

答案 0 :(得分:0)

你好像缺少分隔符:

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

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

答案 1 :(得分:0)

您的创建操作存在问题。

 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异常而不是返回布尔值。而红宝石如果将其视为真实。
  2. 没有模板渲染或重定向。

  3. 如果您添加&#34; p @ user.errors&#34;对于你的if和else语句,你会发现你的密码太短了。

  4. 我想知道以下代码是否有效。如果它有效,那么doc在哪里?感谢。

    render @user.error_messages.full
    

答案 2 :(得分:0)

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

然后检查数据库中是否存在用户: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

请注意,您无需在数据库中添加password_confirmation,因此要测试此验证,请将此添加到您的用户模型中

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

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