1

在我的情况下,即使存在验证错误,它也不会显示验证错误消息。

例如,我将这两列留空,并确保输入了验证码。然后如果我尝试创建新记录。它不会显示验证错误:(它返回表单但没有消息。

我一直在这个项目中使用验证错误消息,我从来没有遇到过这个问题。

任何人都可以在这里找到问题吗?

主题模型中的验证

validates :title,   
    :presence => {:message => "can't be empty" },    
    :uniqueness => {:message => "choose unique title" },    
    :length => { :maximum => 20, :message => "must be less than 20 characters" }

validates :body,   
    :presence => {:message => "can't be empty" },    
    :length => { :maximum => 500, :message => "must be less than 20 characters" }

形式

<%= form_for([@community, @topic]) do |f| %>
.....

    <%= button_tag( :class => "btn btn-primary") do %>
    Create
    <% end %>

<% end %>

主题控制器

before_filter :simple_captcha_check, :only => [:update, :create]

def simple_captcha_check
    if !simple_captcha_valid?
        flash[:error] = 'wrong captcha'
        if request.put?
            @topic.attributes = params[:topic]  
            render :action => :edit
        elsif request.post?     
            @topic = Topic.new params[:topic]
            render :action => :new
        end
    end
end


def create
    @topic = @community.topics.build (params[:topic]) 
    @topic.user_id = current_user.id

    respond_to do |format|
        if @topic.save
            format.html { redirect_to community_topic_path(@community, @topic), notice: 'Created' }
            format.json { render json: [@community, @topic], status: :created, location: @topic }
        else
            format.html { render action: "new" }
            format.json { render json: @topic.errors, status: :unprocessable_entity }
        end
    end
end

路线.rb

resources :communities do
     resources :topics
end

更新:

视图/布局/application.html.erb

.....
<% flash.each do |name, msg| %>
  <div class="alert alert-<%= name == :notice ? "success" : "error" %>">
    <a class="close" data-dismiss="alert">&#215;</a>
    <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
  </div>
<% end %>
.....
4

1 回答 1

5

Flash 直到下一个请求才会出现。因此,如果您正在执行“重定向”,它会出现。

但是,您正在进行渲染而不是重定向。渲染时,您返回视图本身的主体。

但是不用担心,如果你想渲染一个视图(这很好),使用这样的闪光灯 -

flash.now[:error] = 'wrong captcha'

.now 确保闪存在同一请求中的渲染视图中被刷新。

编辑:

您的验证不出现的原因(当验证码失败时)是因为您的 before_filter 进行渲染并阻止创建操作甚至被调用。@topic 验证仅在 create 中的 @topic.save 处触发,但由于它永远不会被调用(当验证码失败时),因此不会出现与属性验证相关的任何内容。

其次, flash.now[:error] 将确保 flash 消息不会转移到下一个请求,因为您打算在同一个请求的响应中使用。但是,如果您设置 flash[:error] 并渲染,那么您的 flash 消息将出现在同一个请求的响应和下一个请求中。这应该回答上面@saurabh 的好问题并解开谜团?

最终编辑:@MKK 必须包含一个显示视图中缺少的部分的错误。

于 2013-01-24T07:30:47.410 回答