始终使用Ruby on Rails在表单上显示错误消息

时间:2015-12-28 07:10:21

标签: ruby ruby-on-rails-4

我正面临这个问题如何解决这个问题?

这是我的问题,始终显示错误消息:

enter image description here

这是我的模特:

validates :first_name, :presence => true, :length => { :in => 3..20 }
validates :last_name, :presence => true, :length => { :in => 3..20 }
validates :email, :presence => true, :uniqueness => true, format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }
# validates :passkey, :confirmation => true #password_confirmation attr
validates_length_of :passkey, :presence => true, :in => 6..20, :on => :register

这是我的控制器:

def register
  params.permit!
  @jobseekers = Jobseeker.new(params[:jobseekers])

  if @jobseekers.save
    redirect_to home_path
  else
    render "register"
  end
end

这是我的观点:

<%= form_for :jobseekers, url: register_path(@jobseekers), method: :patch  do |f| %>

    <%= f.text_field :first_name, placeholder: 'First Name'%>

    <%= f.text_field :last_name, placeholder: 'Last Name'%>

    <%= f.text_field :email, placeholder: 'Email'%>

    <%= f.password_field :passkey, placeholder: 'Password'%>

    <%= f.submit "Create Account" %>

<% end %>

  <% if @jobseekers.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@jobseekers.errors.count, "error") %> prohibited this article from being saved:</h2>

    <ul>
      <% @jobseekers.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
  

点击submit按钮后我需要显示此错误,但现在始终显示此错误。

请帮忙!

现在我正在使用ruby 1.9.7 rails 4.2.5&amp; mysql2

2 个答案:

答案 0 :(得分:1)

代码中的问题是控制器操作:

def register
  params.permit!
  @jobseekers = Jobseeker.new(params[:jobseekers])

  if @jobseekers.save
    redirect_to home_path
  else
    render "register"
  end
end

如果您看一下,那么您不必创建新对象@jobseekers,而是立即尝试保存它。 if @jobseekers.save将为false,因为第一次调用操作时params[:jobseekers]为空。由于您有验证,它会自动添加错误,您的register视图将会显示这些错误。这就是为什么通常有两种形式的行为 - newcreate

要解决此问题,请将此拆分为两个操作

def register
  @jobseekers = Jobseeker.new
end

def create_register
  params.permit!
  @jobseekers = Jobseeker.new(params[:jobseekers])

  if @jobseekers.save
    redirect_to home_path
  else
    render "register"
  end
end

其中create_register只有post路由且registerget路由(register将首次呈现该表单,之后submit将调用create_register,如果有任何错误,则表单会显示错误

这将是您的观点(在这种情况下说明该方法不是必需的):

<%= form_for :jobseekers, url: create_register_path(@jobseekers) do |f| %>

    <%= f.text_field :first_name, placeholder: 'First Name'%>

    <%= f.text_field :last_name, placeholder: 'Last Name'%>

    <%= f.text_field :email, placeholder: 'Email'%>

    <%= f.password_field :passkey, placeholder: 'Password'%>

    <%= f.submit "Create Account" %>

<% end %>

  <% if @jobseekers.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@jobseekers.errors.count, "error") %> prohibited this article from being saved:</h2>

    <ul>
      <% @jobseekers.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
      <% end %>
    </ul>
  </div>

和您的routes.rb条目:

get '/register', to: "jobseekers#register"
post '/register', to: "jobseekers#create_register"

答案 1 :(得分:1)

对Kkulikovskis的另一种看法&#39;答案是:

def register
  params.permit!
  @jobseekers = Jobseeker.new(params[:jobseekers])
  return true if request.get? # <--- skip validations if not on form submit

  if @jobseekers.save
    redirect_to home_path
  else
    render "register"
  end
end

@jobseeker的实例化不那么简单时,我更喜欢这种方法

PS params.permit!是通往地狱的道路,不要这样做