Simple_form 必填字段无效 - Ruby 在 Rails
Simple_form required field does not work - Ruby on Rails
我在 RoR 应用程序中有一个提交表单,是使用 simple_form 构建的。当字段为空白时,应用程序仍会继续下一步,而不会提示错误或警告。默认情况下,这些字段应该是 required: true
;但即使手动编写也行不通。
应用程序有 3 个步骤:NewPost(新视图)-> Preview(创建视图)-> Post.
摘录我的控制器和视图会更清楚:
def new
@post= Post.new
end
def create
@post = Post.new(params.require(:post).permit(:title, :category_id))
if params[:previewButt] == "Continue to Preview your Post"
render :create
elsif params[:createButt] == "OK! Continue to Post it"
if @post.save!
redirect_to root_path
else
render :new
end
elsif params[:backButt] == "Make changes"
render :new
end
end
我的新视图(摘录):
<%= simple_form_for @post do |form| %>
<%= form.input :title, input_html: { class: 'post-title-input' }, label: false, hint: '"Your post title"' %>
<%= form.collection_radio_buttons(:category_id, Category.all, :id, :name, :item_wrapper_class => "selectable" ) %>
<%= form.button :submit , name: "previewButt", value: "Continue to Preview your Post", class: "btn btn-lg btn-primary btn-preview" %>
<% end %>
我的创建视图(提取):
<%= simple_form_for @post do |form| %>
<%= form.hidden_field :title, {:value => @post.title} %>
<%= form.hidden_field :category_id, {:value => @post.category_id} %>
<% end %>
请注意,问题不在保存时,模型定义工作正常,问题仅在 simple_form.
class Post < ActiveRecord::Base
belongs_to :category
validates :title, presence: true
validates :category_id, presence: true
end
解决方案感谢DickieBoy提示:
将控制器更改为:
def create
@post = Post.new(params.require(:post).permit(:title, :category_id))
if params[:previewButt] == "Continue to Preview your Post"
if @post.valid?
render :create
else
render :new
elsif params[:createButt] == "OK! Continue to Post it"
if @post.save!
redirect_to root_path
else
render :new
end
elsif params[:backButt] == "Make changes"
render :new
end
end
它会转到创建视图,因为您没有告诉它任何不同。
@post = Post.new(params.require(:post).permit(:title, :category_id))
创建一个 Post
的新实例,其中的参数是空的。新调用在验证方面不执行任何操作。你想要这样的东西:
@post = Post.new(params.require(:post).permit(:title, :category_id))
if @post.valid? && params[:previewButt] == "Continue to Preview your Post"
....
simple_form 初始化程序中有一个设置可以激活客户端验证。无论客户端验证如何,您还必须保持服务器端验证(您当前正在做的事情)。要使用 simple_form 实施客户端验证,请执行以下操作:
config/initializers/simple_form.rb
config.browser_validations = true
我在 RoR 应用程序中有一个提交表单,是使用 simple_form 构建的。当字段为空白时,应用程序仍会继续下一步,而不会提示错误或警告。默认情况下,这些字段应该是 required: true
;但即使手动编写也行不通。
应用程序有 3 个步骤:NewPost(新视图)-> Preview(创建视图)-> Post.
摘录我的控制器和视图会更清楚:
def new
@post= Post.new
end
def create
@post = Post.new(params.require(:post).permit(:title, :category_id))
if params[:previewButt] == "Continue to Preview your Post"
render :create
elsif params[:createButt] == "OK! Continue to Post it"
if @post.save!
redirect_to root_path
else
render :new
end
elsif params[:backButt] == "Make changes"
render :new
end
end
我的新视图(摘录):
<%= simple_form_for @post do |form| %>
<%= form.input :title, input_html: { class: 'post-title-input' }, label: false, hint: '"Your post title"' %>
<%= form.collection_radio_buttons(:category_id, Category.all, :id, :name, :item_wrapper_class => "selectable" ) %>
<%= form.button :submit , name: "previewButt", value: "Continue to Preview your Post", class: "btn btn-lg btn-primary btn-preview" %>
<% end %>
我的创建视图(提取):
<%= simple_form_for @post do |form| %>
<%= form.hidden_field :title, {:value => @post.title} %>
<%= form.hidden_field :category_id, {:value => @post.category_id} %>
<% end %>
请注意,问题不在保存时,模型定义工作正常,问题仅在 simple_form.
class Post < ActiveRecord::Base
belongs_to :category
validates :title, presence: true
validates :category_id, presence: true
end
解决方案感谢DickieBoy提示:
将控制器更改为:
def create
@post = Post.new(params.require(:post).permit(:title, :category_id))
if params[:previewButt] == "Continue to Preview your Post"
if @post.valid?
render :create
else
render :new
elsif params[:createButt] == "OK! Continue to Post it"
if @post.save!
redirect_to root_path
else
render :new
end
elsif params[:backButt] == "Make changes"
render :new
end
end
它会转到创建视图,因为您没有告诉它任何不同。
@post = Post.new(params.require(:post).permit(:title, :category_id))
创建一个 Post
的新实例,其中的参数是空的。新调用在验证方面不执行任何操作。你想要这样的东西:
@post = Post.new(params.require(:post).permit(:title, :category_id))
if @post.valid? && params[:previewButt] == "Continue to Preview your Post"
....
simple_form 初始化程序中有一个设置可以激活客户端验证。无论客户端验证如何,您还必须保持服务器端验证(您当前正在做的事情)。要使用 simple_form 实施客户端验证,请执行以下操作:
config/initializers/simple_form.rb
config.browser_validations = true