1

私はFormstaticと一緒にBootstrap-Sassを使用しています。この写真のように、Formstaticを使用してフィールドの横にエラーメッセージが自動的に表示されるはずだと思いました:(出典:asciicasts.comここ

しかし、ユーザーが無効な入力を行っても、私のアプリはエラーメッセージを表示しません。これは簡単な問題のようですが、背後にある理由を理解することはできません。

PostController

# POST /posts
# POST /posts.json
def create
  @post = Post.new(params[:post])
  @post.view = 0
  @post.like = 0 
  @post.hate = 0
  respond_to do |format| 
    if @post.save
      @posts = Post.paginate(:page => params[:page], order: 'like desc', per_page: 10) 
      format.html { redirect_to posts_path }
      format.json { render json: @post, status: :created, location: @post }
    else
      format.html { render action: "new" }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

PostModel

  validates :name,  :presence => true
  validates :content, :presence => true,
                      :length => { :minimum => 10, :maximum => 300}

_form(投稿)

<% @post = Post.new %>
<%= semantic_form_for @post do |f| %>
<%= f.semantic_errors :name %>
<%= f.inputs do %>
     <%= f.input :name, :label => 'name' %>
     <%= f.input :content, :label => 'body' %>
<% end %>
<%= f.actions do %>
    <%= f.action :submit, :button_html => { :class => "btn btn-primary" }, :as => :button  %>
    <%= f.action :cancel, :as => :link %>
<% end %>

PostControllerで、次の2行を削除してみました

    #format.html { render action: "new" }
    #format.json { render json: @post.errors, status: :unprocessable_entity }

と追加

render @post.errors

それから、私は得ました

@messages={:name=>["can't be blank"], :content=>["can't be blank", "is too short (minimum is 10 characters)"]}>

したがって、問題は、jsonのレンダリング方法が間違っている可能性があると思います。誰かがそれを修正する方法を教えてもらえますか?

4

1 に答える 1

0

Rails には検証エラー用の独自のレンダリングがあり、これは Bootstrap で使用される HTML 構造または CSS 構造と一致しません。

この問題を解決するには、出力エラーの独自のコード ブロックを表示するように追加するだけです。

<% if @posts and @posts.errors and @posts.errors.count > 0 %>
 <div class="alert alert-danger">
   <a class="close" data-dismiss="alert">&times;<a>
   <strong><%= pluralize(@posts.errors.count,"error") %> validation problems found.</strong>
   <ul>
   <% @posts.errors.full_messages.each do |error| %>
     <li><%= error %></li>
   <% end %>
   </ul>
 </div>

または、このブロックを部分テンプレートに移動して、コードの重複を避けることができます。

<% if resource and resource.errors and resource.errors.count > 0 %>
  <div class="alert alert-danger">
    <a class="close" data-dismiss="alert">&times;<a>
    <strong><%= pluralize(resource.errors.count,"error") %> validation problems found.</strong>
    <ul>
    <% resource.errors.full_messages.each do |error| %>
      <li><%= error %></li>
    <% end %>
    </ul>
  </div>
<% end %>

@posts をパラメーターに渡す

<%= render "shared/validation_errors", :resource => @posts %>

ここで、この問題に関する詳細情報を見つけることができます http://fizzylogic.nl/2013/12/22/temp-slug-54/

于 2014-12-08T20:25:36.440 に答える