Rails - 简单的表单验证

时间:2013-05-23 22:36:14

标签: ruby-on-rails forms validation

对于我的应用程序,用户可以通过用户自己的显示页面上的simple_form创建帖子。我在帖子模型中验证了要求存在是真的。如果没有输入,而不是收到错误通知告诉我我的字段是空白的,我得到ActiveRecord :: RecordInvalid,验证失败。

如何让它在表单上创建错误通知告诉我一个字段是空白的?

请参阅下面的代码。

user.rb

has_many :posts

post.rb

attr_accessible :user_id, :category
belongs_to :user
validates :category, presence: true

查看/用户/ show.html.erb

<%= render 'posts/form' %>

查看/帖/ _form.html.erb

<p>Add Post:</p>
<%= simple_form_for([@user, @user.posts.build]) do |f| %>
    <%= f.error_notification %>
    <%= f.input :category %>
    <%= f.submit "Add Post", :class => "btn btn-header" %>
<% end %>

posts_controller.rb

  def create
    @user = User.find(params[:user_id])
    @post = @user.posts.build(params[:post])

    respond_to do |format|
      if @post.save
        format.html { redirect_to user_path(@user), notice: 'Post was successful.' }
        format.json { head :no_content }
      else
        format.html { redirect_to user_path(@user) }
        format.json { render json: @post.user.errors, status: :unprocessable_entity }
      end
    end
  end

1 个答案:

答案 0 :(得分:2)

@post = @user.posts.create!(params[:post])是问题所在。 create!方法验证您尝试创建的模型,然后在验证失败时引发异常。

你应该这样做:

@post = @user.posts.build(params[:post])

if @post.save
  # do some good stuff
else
  # do some bad stuff
end

这不会引发任何异常,并且会按照您的意愿运行。如果您想显示出错信息,则必须render :new代替{{1}}