试图在rails中查看错误消息

时间:2015-08-09 10:57:19

标签: ruby-on-rails ruby forms validation



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;
&#13;
&#13;

我是Ruby的新手。我正在学习Michael Hartl的教程。在创建注册表单(教程7)时,我不得不显示错误消息(如果我们将任何字段留空,那么应该是红色的通知吗?)。我添加了error_messages.html.erb文件。以表格形式呈现。仍然没有消息。

我猜到的是,我在表单创建中使用:user来保存用户。应该在哪里@user。这样它可以创建用户? 但是当我这样做时,它给了我user_path的匿名错误。我在堆栈上搜索了错误消息的显示但无法找到。 请帮助我。我很久以前就被困住了。

&#13;
&#13;
<% 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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

您已在多个地方使用User模型。实际模型称为Person。在所有控制器和模型类中切换到此型号名称。

我也想提出一个建议。学习本教程时,请不要盲目复制和粘贴片段。了解他们的目的是什么,并将它们写在您自己的文件中。

答案 1 :(得分:0)

根据我在GitHub repo中看到的代码,我发现的主要问题是命名。名称person中存在大量冲突,其复数为people而非persons

Rails有多种模型名称的方式,因此UserUsersControllerPersonPeopleController等等。

以下是解决注册问题所需的更改:

  1. 您需要将控制器名称从PersonsController更改为PeopleController(类名和文件名)。

  2. PeopleController中,强参数方法Person_params需要更改为小写(person_params)。否则,Rails会把它当作一个常量名称并开始寻找它而不会找到它。

  3. 您必须将persons文件夹中的app/views文件夹名称更新为people,原因与上述相同。

  4. routes.rb文件中,需要进行两项更改。将resource :person更改为resources :peopleget 'signUp'应与'people#new'相匹配,而不是'人#new'(现在您知道原因)。

  5. 在名为app/views/people的{​​{1}}中创建新文件。创建人员后,Rails会自动呈现此文件,如果找不到则会抛出异常。

  6. 在文件create.html.erb中,将传递给app/views/people/new.html.erb的变量从form_for更改为:person@person是访问该网页时初始化的实例变量(请参阅@person中的new操作)。

  7. 我不确定是否需要进行此项更改,但如果您在进行上述更改后遇到任何错误,请将PeopleController添加到gem 'therubyracer'并运行Gemfile 。这将安装我相信这个版本的Rails所需的rubyracer gem。

  8. 您应该熟悉框架和Ruby语言的基础知识。它可以帮助您自己识别和调试这些问题。但我想,既然你是新手,这个冗长的答案可能有助于摆脱你的挫败感:)。