我正面临这个问题如何解决这个问题?
这是我的问题,始终显示错误消息:
这是我的模特:
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
答案 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
视图将会显示这些错误。这就是为什么通常有两种形式的行为 - new
和create
。
要解决此问题,请将此拆分为两个操作
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
路由且register
有get
路由(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!
是通往地狱的道路,不要这样做