简化表单的必填字段不起作用 - Ruby on Rails

5

我在一个使用simple_form构建的RoR应用程序中有一个提交表单。当字段为空时,该应用程序仍会继续到下一步,而不会提示错误或警告。这些字段默认情况下应为required: true;但即使手动编写也无效。

该应用程序有三个步骤: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
2个回答

18

在simple_form的初始化器中,有一个设置可以激活客户端验证。无论客户端是否进行验证,您都必须保留服务器端验证(您当前正在执行的操作)。要使用simple_form实现客户端验证,请执行以下操作:

config/initializers/simple_form.rb

config.browser_validations = true

1

它会跳转到创建视图,因为你没有告诉它其他的选择。

@post = Post.new(params.require(:post).permit(:title, :category_id))

用来创建一个新的Post实例,使用从表单中传递的参数,这些参数是空的。在验证方面,new方法不会执行任何操作。你需要像这样做:

@post = Post.new(params.require(:post).permit(:title, :category_id))

if @post.valid? && params[:previewButt] == "Continue to Preview your Post"
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接