1

私の状況では、検証エラーがあったとしても、どういうわけか検証エラーメッセージが表示されません。

たとえば、これらの 2 つの列を空のままにして、キャプチャ ワードが入力されていることを確認します。次に、新しいレコードを作成しようとするとします。検証エラーは表示されません:(フォームに戻りますが、メッセージは表示されません。

このプロジェクトでは常に検証エラー メッセージを使用してきましたが、この問題に直面したことはありません。

誰でもここで問題を見つけることができますか?

トピック モデルでの検証

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 でのみ発生しますが、それは呼び出されないため (captcha が失敗した場合)、属性検証に関連するものは何も表示されません。

第二に、flash.now[:error] は、同じリクエストのレスポンスで使用するつもりなので、フラッシュ メッセージが次のリクエストに転送されないようにします。ただし、flash[:error] を設定してレンダリングすると、flash メッセージが同じリクエストのレスポンスと次のリクエストにも表示されます。これは、上記の@saurabhの良い質問に答え、謎を解決するはずですか?

最終編集: @MKK は、ビューにないパーシャルを表示するエラーを含める必要がありました。

于 2013-01-24T07:30:47.410 に答える