2017-02-14 49 views
1

Я изо всех сил пытаюсь понять, как использовать простую форму с рельсами 5, чтобы я мог показывать полные сообщения об ошибках в моих формах. Все, что я получаю окно в верхней части с сообщением, которое говорит:Rails - Simple Form Bootstrap - показать полный текст ошибки inline - (или где угодно)

Please review the problems below: 

Вместо списка задач или любой выделенной области формы - я не получаю ничего.

Я воспользовался советами в this post и заменил все ссылки на ошибку в моем инициализаторе на «full_error», но это решает проблему только для родительской формы. Вложенные поля все равно получают неполное сообщение об ошибке. Кто-нибудь знает, как идентифицировать ошибки в простой форме?

# Use this setup block to configure all options available in SimpleForm. 
SimpleForm.setup do |config| 
    config.error_notification_class = 'alert alert-danger' 
    config.button_class = 'btn btn-green' 
    config.boolean_label_class = nil 

    config.wrappers :vertical_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.use :placeholder 
    b.optional :maxlength 
    b.optional :pattern 
    b.optional :min_max 
    b.optional :readonly 
    b.use :label, class: 'control-label' 

    b.use :input, class: 'form-control' 
    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
    b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 

    config.wrappers :vertical_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.use :placeholder 
    b.optional :maxlength 
    b.optional :readonly 
    b.use :label, class: 'control-label' 

    b.use :input 
    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
    b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 

    config.wrappers :vertical_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.optional :readonly 

    b.wrapper tag: 'div', class: 'checkbox' do |ba| 
     ba.use :label_input 
    end 

    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
    b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 

    config.wrappers :vertical_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.optional :readonly 
    b.use :label, class: 'control-label' 
    b.use :input 
    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
    b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 

    config.wrappers :horizontal_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.use :placeholder 
    b.optional :maxlength 
    b.optional :pattern 
    b.optional :min_max 
    b.optional :readonly 
    b.use :label, class: 'col-sm-3 control-label' 

    b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 
     ba.use :input, class: 'form-control' 
     ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
     ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 
    end 

    config.wrappers :horizontal_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.use :placeholder 
    b.optional :maxlength 
    b.optional :readonly 
    b.use :label, class: 'col-sm-3 control-label' 

    b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 
     ba.use :input 
     ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
     ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 
    end 

    config.wrappers :horizontal_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.optional :readonly 

    b.wrapper tag: 'div', class: 'col-sm-offset-3 col-sm-9' do |wr| 
     wr.wrapper tag: 'div', class: 'checkbox' do |ba| 
     ba.use :label_input 
     end 

     wr.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
     wr.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 
    end 

    config.wrappers :horizontal_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.optional :readonly 

    b.use :label, class: 'col-sm-3 control-label' 

    b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 
     ba.use :input 
     ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
     ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 
    end 

    config.wrappers :inline_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.use :placeholder 
    b.optional :maxlength 
    b.optional :pattern 
    b.optional :min_max 
    b.optional :readonly 
    b.use :label, class: 'sr-only' 

    b.use :input, class: 'form-control' 
    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
    b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 

    config.wrappers :multi_select, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 
    b.use :html5 
    b.optional :readonly 
    b.use :label, class: 'control-label' 
    b.wrapper tag: 'div', class: 'form-inline' do |ba| 
     ba.use :input, class: 'form-control' 
     ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' } 
     ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 
    end 
    end 
    # Wrappers for forms and inputs using the Bootstrap toolkit. 
    # Check the Bootstrap docs (http://getbootstrap.com) 
    # to learn about the different styles for forms and inputs, 
    # buttons and other elements. 
    config.default_wrapper = :vertical_form 
    config.wrapper_mappings = { 
    check_boxes: :vertical_radio_and_checkboxes, 
    radio_buttons: :vertical_radio_and_checkboxes, 
    file: :vertical_file_input, 
    boolean: :vertical_boolean, 
    datetime: :multi_select, 
    date: :multi_select, 
    time: :multi_select 
    } 
end 

ФОРМА

<%= simple_form_for(@proposal) do |f| %> 
    <%= f.error_notification %> 

<% @proposal.errors.full_messages.each do |msg| %> 
    <%= li= msg %> 
<% end %> 



    <div class="form-inputs" style="margin-bottom: 50px"> 
    <!-- General Organisation details --> 
    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :title, :label => "Title" %> 

     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :byline, :label => "Tagline" %> 
     </div> 
    </div> 

    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :description, as: :text, :label => "Outline your proposal", input_html: { rows: 15 } %> 
     </div> 
    </div> 




    <!-- Package: :ethics considerations --> 
    <div class="row"> 
    <div class="col-md-12"> 
     <div class="form_title">Research Ethics</div> 
    </div> 
    </div> 

    <div class="row"> 
    <div class="col-md-12"> 

    <%= f.simple_fields_for :ethics do |f| %> 
     <%= f.error_notification %> 
     <%= render 'package/ethics/ethics_fields', f: f %> 

    <% end %> 

    <%= link_to_add_association 'Add another ethics issue', f, :ethics, partial: 'package/ethics/ethics_fields' %> 
    </div> 
    </div> 


    </div> 

    <div class="row"> 
    <div class="col-md-10 col-md-offset-1" style="margin-top: 50px"> 
     <div class="form-actions"> 
     <%= f.button :submit %> 
     </div> 
    </div> 
    </div> 
<% end %> 

NESTED ПОЛЯ

<div class="nested-fields"> 

    <%# @proposal.ethics.errors.full_messages.each do |e| %> 
     <li><%#= e %></li> 
    <%# end %> 
    <div class="form-inputs"> 
     <div class="row"> 
      <div class="col-md-12 "> 
      <%= f.select :category, [ "Risk of harm", "Informed consent", "Anonymity and Confidentiality", "Deceptive practices", "Right to withdraw"], { label: "Principle" }, id: "main_category" %> 
      <%= f.select :subcategory, [], {}, id: "sub_category", disabled: true %> 
      <%= f.input :consideration, as: :text, :label => "Identify the ethics considerations?", :input_html => {:rows => 8} %> 
      <%= f.input :plan, as: :text, :label => "How will these considerations be managed?", :input_html => {:rows => 8} %> 
     </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-6" style="margin-top: 20px; margin-bottom: 50px"> 
     <%= link_to_remove_association 'Remove this ethical issue', f %> 
     </div> 

    </div> 
</div> 
+0

Пожалуйста, заполните форму. – Sravan

+0

добавленная форма выше – Mel

ответ

0

Похоже, вы получаете Haml и эрб замешаны в ваших ошибках отображаются код.

Это:

<% @proposal.errors.full_messages.each do |msg| %> 
    <%= li= msg %> 
<% end %> 

должен выглядеть следующим образом:

<% if @proposal.errors.any? %> 
<ul> 
<% @proposal.errors.full_messages.each do |msg| %> 
    <li><%= msg %></li> 
</ul> 
<% end %> 

Я предполагаю, что вы используете кокон так что вам необходимо установить, что правильно, но есть глюк, когда с использованием Rails 5.

Вам нужно что-то вроде следующего в моделях:

class Proposal < ApplicationRecord 
    has_many: :ethics, inverse_of: :proposal 
    accepts_nested_attributes_for :ethics ... 
... 

и

class Ethic < ApplicationRecord 
    belongs_to :proposal, inverse_of: :ethics 
... 

Примечание has_many .. inverse_of пункта, который работает круглый с ошибкой в ​​5 Rails.

Если вы правильно настроили условие accepts_nested_attributes_for, я думаю, что @ proposal.errors должен содержать все ошибки для формы.

+0

Вы правы с обратной вещью в этической модели - это заставило ошибку уйти, но как я печатаю ошибки для этических атрибутов в вложенная часть этической формы? Они перечислены в верхней части формы с списком ошибок предложения, но все, что я получаю, когда я перехожу к атрибутам этики, - это красная рамка, пожалуйста, просмотрите перечисленные ниже проблемы, а затем нет списка. – Mel

+0

Я не думаю, что существует очевидный способ разделить родительские и дочерние ошибки. Я удаляю строку «<% = f.error_notification%>» из блока simple_fields_for и полагаюсь на simple_form для создания ваших сообщений об ошибках. Кстати, как сказал Сраван, вам нужна другая переменная для вашего блока simple_fields_for. –

+0

, но на самом деле он отлично работает с f: f - я не уверен, что мне это нужно. Атрибуты создаются с использованием f (так же, как предложение). – Mel

0

Первая ошибка, которую я нашел в вашем коде, в вашем вложенном поле вы взяли ту же переменную f в параметр, который может быть прерван с родительским параметром enter code here тер f

Так,

вложенными будет,

<%= f.simple_fields_for :ethics do |ff| %> 
     <%= ff.error_notification %> 
     <%= render 'package/ethics/ethics_fields', f: f %> 
<% end %> 

Теперь форма,

<%= simple_form_for(@proposal) do |f| %> 
    <%= f.error_notification %> 

<% @proposal.errors.full_messages.each do |msg| %> 
    <%= li= msg %> 
<% end %> 



    <div class="form-inputs" style="margin-bottom: 50px"> 
    <!-- General Organisation details --> 
    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :title, :label => "Title" %> 

     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :byline, :label => "Tagline" %> 
     </div> 
    </div> 

    <div class="row"> 
     <div class="col-md-12"> 
     <%= f.input :description, as: :text, :label => "Outline your proposal", input_html: { rows: 15 } %> 
     </div> 
    </div> 




    <!-- Package: :ethics considerations --> 
    <div class="row"> 
    <div class="col-md-12"> 
     <div class="form_title">Research Ethics</div> 
    </div> 
    </div> 

    <div class="row"> 
    <div class="col-md-12"> 

    <%= f.simple_fields_for :ethics do |ff| %> 
     <%= ff.error_notification %> 
     <%= render 'package/ethics/ethics_fields', f: ff %> 

    <% end %> 

    <%= link_to_add_association 'Add another ethics issue', f, :ethics, partial: 'package/ethics/ethics_fields' %> 
    </div> 
    </div> 


    </div> 

    <div class="row"> 
    <div class="col-md-10 col-md-offset-1" style="margin-top: 50px"> 
     <div class="form-actions"> 
     <%= f.button :submit %> 
     </div> 
    </div> 
    </div> 
<% end %> 




<%= f.simple_fields_for :ethics do |ff| %> 
    <%= ff.error_notification %> 
    <%= render 'package/ethics/ethics_fields', f: ff %> 
    <% @proposal.ethics.errors.full_messages.each do |msg| %> 
     <%= li= msg %> 
    <% end %> 
<% end %> 

Edit: Даже если выше не решает проблему,

Попробуйте получить ошибки от ethics object от @proposal переменной

Так,

<%= f.simple_fields_for :ethics do |ff| %> 
    <%= ff.error_notification %> 
    <% @proposal.ethics.errors.full_messages.each do |msg| %> 
    <%= li= msg %> 
    <% end %> 
    <%= render 'package/ethics/ethics_fields', f: f %> 
<% end %> 
+0

pls, проверить этот ответ, вы можете задать любые вопросы. – Sravan

+0

, но если это так, все этические поля не будут работать. f.input отлично работает в этических вложенных полях, частичных для входных элементов. Я не могу найти способ отображения ошибок в этой форме. – Mel

+0

Работает макет полей этики, но сообщения об ошибках могут не отображаться. проверьте последнюю часть ответа. – Sravan

0

Другим вариантом может быть отображение сообщений об ошибках непосредственно в поле.

<%= f.input :title, :label => "Title", id:"title" %> 
<%= f.error :title, :id => "title_error" %> 

Это сообщение об ошибке для заголовка рядом с полем заголовка. Вы можете добавить метод f.error в каждое поле в своей форме вместо отображения <ul> над формой или вместе с <ul> над вашей формой.

Для nested_form_fields попробуйте добавить validates_associated :assoc_model_name в основную модель. Это также проведет проверки для соответствующей модели.

+0

Это должно происходить автоматически, используя драгоценный камень simple_form. Он включает ошибки, когда это необходимо, даже для связанных полей. –