Работа с формой:
<%= form_for(@contact, html: {multipart: true}) do |f| %>
<div class="card">
<div class="card-header">
<h2 class="display-5 main-text-blue text-center font-weight-bold">Add New Contact</h2>
</div>
<div class="card-body">
<div class="errors">
<% if @contact.errors.any? %>
<div class="alert alert-danger">
<h5 class="text-center mb-n1 pb-1"><i class="fa fa-exclamation-triangle text-danger"></i> Please correct the following errors: </h5>
</div>
<% end %>
</div>
<div class="form-group row">
<div class="col-md-5 mx-auto">
<div class="wrap" id="avatar-container">
<div class="valign-middle">
<div class="form-group">
<% if @contact.new_record? %>
<%= image_tag "100x100.png", class: "img-responsve img-preview" %>
<% else %>
<%= image_tag @contact.avatar, class: "img-responsve img-preview" %>
<% end %>
<label for="file" class="sr-only">Choose Image</label>
<%= f.file_field :contact_avatar, id: "file" %>
</div>
</div>
</div>
</div>
</div>
<div class="form-group row">
<%= f.label :name, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :name, class: "form-control #{'is-invalid' if has_error?(@contact, :name) }", id: "name", placeholder: "Name.." %>
<% if has_error?(@contact, :name) %>
<span class="text-danger">
<%= get_error(@contact, :name)%>
</span>
<% end %>
</div>
</div>
<div class="form-group row">
<%= f.label :email, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :email, class: "form-control #{'is-invalid' if has_error?(@contact, :email) }", id: "email", placeholder: "Email.." %>
<% if has_error?(@contact, :email) %>
<span class="text-danger">
<%= get_error(@contact, :email)%>
</span>
<% end %>
</div>
</div>
<div class="form-group row">
<%= f.label :mobile, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :mobile, class: "form-control #{'is-invalid' if has_error?(@contact, :mobile) }", id: "mobile", placeholder: "Mobile.." %>
<% if has_error?(@contact, :mobile) %>
<span class="text-danger">
<%= get_error(@contact, :mobile)%>
</span>
<% end %>
</div>
</div>
<div class="form-group row">
<%= f.label :phone, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :phone, class: "form-control #{'is-invalid' if has_error?(@contact, :phone) }", id: "phone", placeholder: "Phone.." %>
<% if has_error?(@contact, :phone) %>
<span class="text-danger">
<%= get_error(@contact, :phone)%>
</span>
<% end %>
</div>
</div>
<div class="form-group row">
<%= f.label :country, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :country, class: "form-control", id: "country", placeholder: "Country.." %>
</div>
</div>
<div class="form-group row">
<%= f.label :address, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_field :address, class: "form-control", id: "address", placeholder: "Address.." %>
</div>
</div>
<div class="form-row">
<%= f.label :location, class: "col-lg-2 col-form-label" %>
<div class="col-4">
<%= f.text_field :city, class: "form-control", id: "city", placeholder: "City.." %>
</div>
<div class="col-4">
<%= f.text_field :state, class: "form-control", id: "state", placeholder: "State.." %>
</div>
<div class="col-2">
<%= f.text_field :zip, class: "form-control", id: "zip", placeholder: "Zip.." %>
</div>
</div>
<div class="form-group row category-mt">
<%= f.label :category, class: "col-lg-2 col-form-label" %>
<div class="col-lg-5">
<%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "Select Category" }, id: "category_select", class: "form-control #{'is-invalid' if has_error?(@contact, :category) }" %>
<% if has_error?(@contact, :category) %>
<span class="text-danger">
<%= get_error(@contact, :category)%>
</span>
<% end %>
</div>
<div class="col-lg-3">
<a class="btn btn-outline-secondary add-category-button btn-block mt-1" href="#" id="add-category-btn">Add Category</a>
</div>
</div>
<div class="form-group row" id="add-new-category">
<label class="col-lg-2 col-form-label" for="location">New Category:</label>
<div class="col-lg-10">
<div class="input-group">
<input id="new-category" name="new-category" class="form-control <%= 'is-invalid' if has_error?(@category, :name) %>" placeholder="Enter category name" type="text">
<% if has_error?(@category, :name) %>
<span class="text-danger">
<%= get_error(@category, :name)%>
</span>
<% end %>
<div class="input-group-append">
<button class="btn btn-outline-secondary category-btn" id="save-new-category-btn" type="button"><i class="fa fa-check"></i></button>
</div>
</div>
</div>
</div>
<div class="form-group row">
<%= f.label :note, class: "col-lg-2 col-form-label" %>
<div class="col-lg-10">
<%= f.text_area :note, class: "form-control", id: "note", placeholder: "Note..", rows: "3" %>
</div>
</div>
</div>
<div class="card-footer">
<%= f.submit "Save", class: "btn btn-primary border-button mb-3 ml-3", id: "save-btn" %>
<a class="btn btn-outline-secondary border-button mt-n3" data-dismiss="modal" href="#" id="cancel-btn">Cancel</a>
</div>
</div>
<% end %>
Как вы можете видеть здесь, я размещаю некоторые коды проверки рельсов, которые уже существуют на модели контактов. Например:
<%= f.text_field :name, class: "form-control #{'is-invalid' if has_error?(@contact, :name) }", id: "name", placeholder: "name.." %>
, который добавит класс is-invalid
, если будут какие-либо ошибки. И это также:
<% if has_error?(@contact, :phone) %>
<span class="text-danger">
<%= get_error(@contact, :phone)%>
</span>
<% end %>
, который просто напечатает текст ошибки внизу, если есть ошибка. Вот вспомогательные коды для этого:
def has_error?(resource, field)
resource.errors.messages[field].present?
end
def get_error(resource, field)
msg = resource.errors.messages[field]
field.to_s.capitalize + " " + msg.join(' and ') + '.'
end
Итак, в основном я работаю над двумя таблицами здесь: контакт и категория. Пока что я проверяю в своей форме в основном контакты. У меня есть эта функция здесь, где пользователь может добавить NEW CATEGORY прямо на месте через ajax, который является внешним ключом в таблице контактов, который также можно увидеть в коде выше.
Теперь, насколько я понимаю, я также могу добавить проверку моделей. Поэтому я попытался применить некоторую проверку к моей категории:
validates :name, uniqueness: true
Я надеялся, что это подтвердит уникальность выводимой новой категории, то есть, если текст (имя категории) уже существует в базе данных, он надо запретить и выкинуть ошибку. Итак, я попробовал следующий код, чтобы отобразить ошибку:
<input id="new-category" name="new-category" class="form-control <%= 'is-invalid' if has_error?(@category, :name) %>" placeholder="Enter category name" type="text">
<% if has_error?(@category, :name) %>
<span class="text-danger">
<%= get_error(@category, :name)%>
</span>
<% end %>
И я подумал, что это сработает, но просто выдает ошибку, говорящую undefined method errors' for nil:NilClass
, то есть я думал, что она должна работать, так как я я использую @category
, но потом я понимаю, что это форма для @contact
.
Есть ли лучший способ заставить это работать и отображать ошибку в поле добавления новой категории? Я действительно застрял на этом. Я надеюсь, что кто-то может мне помочь.