복붙노트

[RUBY-ON-RAILS] 레일 3.0에서 f.error_messages

RUBY-ON-RAILS

레일 3.0에서 f.error_messages

3.0되지 f.error_messages 레일 이제 제대로 작동하려면 플러그인이 필요합니다 - 나는 그러나 오류 메시지에게 (신규) 기본 방법을 표시하는 방법을 배우고 싶어요. 나는 의견 양식을 구현할 때 사용되지 않는 방법을 사용하여 시작 설명서를, 다음입니다. 예를 들면 :

<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <%= f.error_messages %>
<div class="field">
  <% f.label :commenter  %><br />
  <%= f.text_field :commenter  %>
</div>
<div class="field">
  <%= f.label :body %><br />
  <%= f.text_area :body %>
</div>
<div class="actions">
  <%= f.submit %>
</div>
<% end %>

여기에 (인공 지지체에 의해 생성 된) 그것을 할 올바른 방법입니다 :

<%= form_for(@post) do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
 . . . 

나는 후자의 예에서 @post 변수를 사용하는 것이 이해하지만 댓글 작성에 대한 오류 메시지를 얻을 이전에 어떤 변수를 참조 할 수 있습니까?

해결법

  1. ==============================

    1.난 그냥 docrails GitHub의 문제로보고, 그들은 덧글에 대한 검증을 수행하는 방법을 설명하는 대신 f.error_messages을 제거하기로 결정했습니다.

    난 그냥 docrails GitHub의 문제로보고, 그들은 덧글에 대한 검증을 수행하는 방법을 설명하는 대신 f.error_messages을 제거하기로 결정했습니다.

  2. ==============================

    2.양식에 error_messages을 구현하는 가장 깨끗한 방법은 FormBuilder에 error_messages을 구현하는 것입니다.

    양식에 error_messages을 구현하는 가장 깨끗한 방법은 FormBuilder에 error_messages을 구현하는 것입니다.

    예를 들어, 여기에 내가 내 마지막 프로젝트 구현 한 error_messages 방법입니다. 자신의 FormBuilder를 위치 : implemeting하여 당신은 당신의 webdesigner의 규칙과 스타일을 따를 수 ... 다음은 그 예입니다 출력됩니다 UL의 오류 목록 / 리는 일부 사용자 지정 스타일로이다 :

    class StandardBuilder < ActionView::Helpers::FormBuilder
      def error_messages
        return unless object.respond_to?(:errors) && object.errors.any?
    
        errors_list = ""
        errors_list << @template.content_tag(:span, "There are errors!", :class => "title-error")
        errors_list << object.errors.full_messages.map { |message| @template.content_tag(:li, message) }.join("\n")
    
        @template.content_tag(:ul, errors_list.html_safe, :class => "error-recap round-border")
      end
    end
    

    그럼 내 형태 :

    = f.error_messages
    

    그리고 그게 다야.

  3. ==============================

    3.나는 확신 모두 당신이해야 할 것 post.comments @ 참조입니다 해요

    나는 확신 모두 당신이해야 할 것 post.comments @ 참조입니다 해요

    당신이 뭔가를 같이 할 수 있도록 :

    <% @post.comments.each do |comment| %>
        <% if comment.errors.any? %>
    
        <% comment.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
    
        <% end %>
    <% end %>
    

    아니면 그냥 밖으로 모든 오류를 당겨 :

    comment_errors = @post.comments.map(&:errors)
    

    출력에 디스플레이 로직 주석 각 오류에 그들을 통해 다음 루프.

  4. ==============================

    4.이 기능은 독립형 보석 dynamic_form로 존재한다.

    이 기능은 독립형 보석 dynamic_form로 존재한다.

    당신의 Gemfile에 다음을 추가

    gem 'dynamic_form'
    

    GitHub의 페이지에서 :

    DynamicForm 당신이 당신의 Rails3 모델을 다루는 데 도움이되는 몇 가지 헬퍼 방법을 보유하고, 그들이 있습니다 :

    또한 양식 빌더에 f.error_messages 및 f.error_message_on을 추가합니다.

  5. ==============================

    5.여기에 전체 오류 현장 내 솔루션입니다.

    여기에 전체 오류 현장 내 솔루션입니다.

    나는 간단하게 렌더링 할 때 하나가 통과 할 모델 변수를 사용하는 부분을 만들어 :

    <%# app/views/errors/_error.html.erb %>
    
    <%= content_for :message do %>
      <% if model.errors.any? %>
        <ul>
          <% model.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
          <% end %>
        </ul>
      <% end %>
    <% end %>
    

    당신은 쉽게 동적 HTML 클래스 및 / 또는 모델의 이름에 따라 ID 이름뿐만 아니라 일반적인 사람을 추가 할 수 있습니다.

    나는 나의 오류 메시지가 레이아웃 파일의 모든 같은 장소에서 렌더링 가지 설정을 가지고 :

    <%# app/views/layouts/application.html.erb %>
    
    <%= yield :message %>
    

    하나는 그 기능을 원하지 않은 경우, 부분에 content_for을 제거하는 트릭을 할 것입니다. 그리고 정말 모든보기에 당신은 당신이 간단하게 쓸 수 있습니다 원하는 :

    <%= render 'errors/error', model: @some_model %>
    

    하나 더 모음을 취하고 상기 부분적인 오류를 활용되는 부분을 작성하여 확장 할 수 :

    <%# app/views/errors/_collection.html.erb %>
    
    <% collection.each do |model| %>
      <%= render 'errors/error', model: model %>
    <% end %>
    

    그것을 함께 렌더링 :

    <%= render 'errors/collection', collection: @some_model.some_has_many_association %>
    

    나는이 방법을 좋아한다. 그것은 쉽게 관리 / 유지, 믿을 수 없을만큼 tweakable하는, 간단합니다. 이게 도움이 되길 바란다!

    편집 : HAML의 모든 것

    -# app/views/errors/_error.html.haml
    
    = content_for :message do
      - if model.errors.any?
        %ul
          - model.errors.full_messages.each do |msg|
            %li= msg
    

    -# app/views/layouts/application.html.haml
    
    = yield :message
    

    = render 'errors/error', model: @some_model
    

    -# app/views/errors/_collection.html.haml
    
    - collection.each do |model|
      = render 'errors/errors', model: @some_model
    

    = render 'errors/_collection', collection: @some_model.some_has_many_association
    
  6. ==============================

    6.I는 [@post @ post.comments.build] 배열은 단지 form_for polymorphic_path의 내부로 전달되는 것을 생각한다. 이 코멘트 (이 경우에는 추천 / 포스트 / 1 / 코멘트)를위한 서브 - 리소스 경로를 생성한다. 그래서 바로 첫 번째 예를 사용하는 같은 게시물에 하위 자원 등의 의견을 보이는?

    I는 [@post @ post.comments.build] 배열은 단지 form_for polymorphic_path의 내부로 전달되는 것을 생각한다. 이 코멘트 (이 경우에는 추천 / 포스트 / 1 / 코멘트)를위한 서브 - 리소스 경로를 생성한다. 그래서 바로 첫 번째 예를 사용하는 같은 게시물에 하위 자원 등의 의견을 보이는?

    그래서 실제로 여기에 호출 될 컨트롤러는 CommentsController이다. 루카스 '솔루션은 당신을 위해 일을하지 않는 이유는 주석을 만들 때 실제로 form_for 호출 할 때 당신이보기에 사용 문제가되지 않습니다 (컨트롤러 내부 post.comments.build @ 사용하지 않는 것이있을 수 있습니다 ). CommentsController 번호는 방법은 (다소)과 같아야 만들 :

    def create
      @post = Post.find(params[:post_id]
      @comment = @post.comments.build(params[:comment])
    
      if(@comment.save)
        # you would probably redirect to @post
      else
        # you would probably render post#show or wherever you have the form
      end
    end
    

    그럼 당신은 발판에 의해 생성 된 코드를 사용할 수 있습니다 만 form_for 호출을 제외한 모든 라인에 @comment와 @post 인스턴스 변수를 대체합니다.

    나는 또한 표시이 양식 form_for 사용 ([포스트 @ @comment], ...) 형태로 내용을 유지하는 제어 방법에 @comment = @ post.comment.build를 추가하는 것이 좋습니다 것 같아요 거기 오류의 경우 형태로 표시됩니다.

    이 일을하지 않는 당신이 그것을 알아낼 수없는 경우, 귀하의 CommentsController 번호가 질문에 대한 방법을 만들 추가하시기 바랍니다.

  7. from https://stackoverflow.com/questions/3873190/f-error-messages-in-rails-3-0 by cc-by-sa and MIT license