class Person < ActiveRecord::Base
before_save {self.email = email.downcase}
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\-.]+\.[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: { maximum: 6}
end
&#13;
我是Ruby的新手。我正在学习Michael Hartl的教程。在创建注册表单(教程7)时,我不得不显示错误消息(如果我们将任何字段留空,那么应该是红色的通知吗?)。我添加了error_messages.html.erb
文件。以表格形式呈现。仍然没有消息。
我猜到的是,我在表单创建中使用:user
来保存用户。应该在哪里@user
。这样它可以创建用户?
但是当我这样做时,它给了我user_path的匿名错误。我在堆栈上搜索了错误消息的显示但无法找到。
请帮助我。我很久以前就被困住了。
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(:person) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :email %>
<%= f.email_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>
<%= f.submit "Create my account", class: "btn btn-primary" %>
<% end %>
</div>
</div>
&#13;
<% if @person.errors.any? %>
<div id="error_explanation">
<div class="alert alert-danger">
the form contains <%= @person.errors.count %> errors.
</div>
<ul>
<%= @person.errors.full_messages.each do |msg| %>
<li> <%= msg %> </li>
<% end %>
</ul>
</div>
<% end %>
&#13;
class PersonsController < ApplicationController
def show
@person = Person.find(params[:id])
end
def new
@person = Person.new
end
def create
@person = Person.new(user_params)
if @person.save
else
render new
end
end
private
def user_params
params.require(:person).permit(:name, :email, :password, :password_confirmation)
end
end
&#13;
Rails.application.routes.draw do
get 'persons/show'
root 'staticpages#home'
get 'help' => 'staticpages#help'
get 'about' => 'staticpages#about'
get 'signUp' => 'persons#new'
resource :person
resources :persons
end
&#13;
// error when i use @user in form. Instead of :user
NoMethodError in PersonsController#new
undefined method `users_path' for #<#<Class:0x007fdb68c0ee78>:0x007fdb68c0e428>
Extracted source (around line #220):
if options.empty?
recipient.send(method, *args)
else
recipient.send(method, *args, options)
end
&#13;
答案 0 :(得分:0)
您已在多个地方使用User
模型。实际模型称为Person
。在所有控制器和模型类中切换到此型号名称。
我也想提出一个建议。学习本教程时,请不要盲目复制和粘贴片段。了解他们的目的是什么,并将它们写在您自己的文件中。
答案 1 :(得分:0)
根据我在GitHub repo中看到的代码,我发现的主要问题是命名。名称person
中存在大量冲突,其复数为people
而非persons
。
Rails有多种模型名称的方式,因此User
有UsersController
而Person
有PeopleController
等等。
以下是解决注册问题所需的更改:
您需要将控制器名称从PersonsController
更改为PeopleController
(类名和文件名)。
在PeopleController
中,强参数方法Person_params
需要更改为小写(person_params
)。否则,Rails会把它当作一个常量名称并开始寻找它而不会找到它。
您必须将persons
文件夹中的app/views
文件夹名称更新为people
,原因与上述相同。
在routes.rb
文件中,需要进行两项更改。将resource :person
更改为resources :people
,get 'signUp'
应与'people#new'
相匹配,而不是'人#new'(现在您知道原因)。
在名为app/views/people
的{{1}}中创建新文件。创建人员后,Rails会自动呈现此文件,如果找不到则会抛出异常。
在文件create.html.erb
中,将传递给app/views/people/new.html.erb
的变量从form_for
更改为:person
。 @person
是访问该网页时初始化的实例变量(请参阅@person
中的new
操作)。
我不确定是否需要进行此项更改,但如果您在进行上述更改后遇到任何错误,请将PeopleController
添加到gem 'therubyracer'
并运行Gemfile
。这将安装我相信这个版本的Rails所需的rubyracer gem。
您应该熟悉框架和Ruby语言的基础知识。它可以帮助您自己识别和调试这些问题。但我想,既然你是新手,这个冗长的答案可能有助于摆脱你的挫败感:)。