【问题标题】:Rails Tutorial Chapter 7 user saves without emailRails 教程第 7 章用户无需电子邮件即可保存
【发布时间】:2017-07-11 20:56:17
【问题描述】:

我一直在阅读 Rails 教程并被困在第 7 章。问题是在通过 rails 控制台(使用 User.new)将注册信息发布到 rails 后,id、created_at 和 updated_at 都变成了 nil。通过创建用户网页创建用户,电子邮件变为零。

user.rb

class User < ApplicationRecord
  before_save { self.email = email.downcase! }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

  validates :name, presence: true, length: { maximum: 50 }
  validates :email, presence: true, length: { maximum: 255 },
        format: { with: VALID_EMAIL_REGEX },
        uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 6 }

  has_secure_password
end

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

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

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

* new.html.erb *

<% provide(:titel, 'Sign Up') %>

<h1>Sign Up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: signup_path) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: "form-control" %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: "form-control" %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: "form-control" %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

rails 控制台输出

irb(main):001:0> user = User.new(name: "Test User", email: "test@user.com", password: "secretsecret", password_confirmation: "secretsecret")
=> #<User id: nil, name: "Test User", email: "test@user.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$E1SvEDh.aQSi809sQ7ecReacmSsnxRDUn3IbEawugQD...">

显示第 7 行引发的 /sample_app/app/views/users/show.html.erb:

def gravatar_for(user, size: 100)
  gravatar_id = Digest::MD5::hexdigest(user.email.downcase) # this line is highlighted
  gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?=#{size}"
  image_tag(gravatar_url, alt: user.name, class: "gravatar")
end

通过检查 development.sqlite3,email 字段为 nil。

我哪里错了?谢谢!

Ruby 2.4,Rail 5.1

【问题讨论】:

  • 你试过save吗? User.new(name: "Test User", email: "test@user.com", password: "secretsecret", password_confirmation: "secretsecret").save
  • 我当然试过了!在 Rails 控制台模式下,它似乎运行良好,但通过 Web 界面电子邮件字段仍然保持为零...
  • 只是想知道,你有repo,看看问题出在哪里?
  • repo 好像没有更新。
  • 如何将新用户发布到控制器?

标签: ruby-on-rails ruby railstutorial.org


【解决方案1】:

User.new 实际上并没有向控制器发出 post 请求。它只是在内存中创建用户对象的新实例,而不将其保存到数据库中。如果您使用 User.create 和相同的参数,您将获得一个 id、一个更新的 at 和一个 created_at - 但这仍然不是向您的控制器发出 post 请求,它只是将其保存到您的数据库中。如果您想对控制器的新操作发出 post 请求,您可以使用新的用户表单创建前端并提交,或者您可以使用 postman 或 curl 之类的东西向您的服务器发出请求。您还必须让您的服务在本地或其他地方运行。我建议在深入研究 Rails 之前查看纯 ruby​​。

https://www.ruby-lang.org/en/documentation/quickstart/3/

https://www.getpostman.com/

https://curl.haxx.se/docs/manpage.html

【讨论】:

    【解决方案2】:

    找错了好久,终于咳出来了!其主要原因是before_save { self.email = email.downcase! } 一段代码。在 user.rb model.before_save { self.email = email.downcase } 中,所以,无需强制小写!

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2017-07-22
      • 2014-10-27
      • 2017-03-30
      相关资源
      最近更新 更多