Хобрук: Ваш путь к мастерству в программировании

Ошибка после миграции с ERB на HAML

Я использовал http://htmltohaml.com/ для преобразования своего ERB, и возникла какая-то проблема.

Рабочий ERB до конвертации

<h3><%= t("admin.labels.employee") %> <%= content_tag(:span, employee_counter) %></h3>
<%
   def create_validation_rules(field_rules)
     Hash[field_rules.map do |rule|
            next ["rule-#{rule[:name]}", rule[:value]] if rule[:value]
            next ["msg-#{rule[:name]}", rule[:msg]] if rule[:msg]
          end] if field_rules
   end
%>
<div class="control-group form-controls">
    <%= f.label :first_name, t("labels.name") %>
    <%= f.text_field :first_name, placeholder: t("labels.first_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_first_name", name: "merchant[employees_attributes][#{index}][first_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:first_name]) %>
    <%= f.text_field :middle_name, placeholder: t("labels.middle_name"), id: "merchant_employees_attributes_#{index}_middle_name", name: "merchant[employees_attributes][#{index}][middle_name]", autocomplete: "off", maxlength: 100, size: nil %>
    <%= f.text_field :last_name, placeholder: t("labels.last_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_last_name", name: "merchant[employees_attributes][#{index}][last_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:last_name]) %>
</div>
<div class="control-group">
  <%= f.label :email, t("labels.email_address") %>
  <%= f.text_field :email, id: "merchant_employees_attributes_#{index}_email", name: "merchant[employees_attributes][#{index}][email]", autocomplete: "off", maxlength: 250, size: nil, data: create_validation_rules(validations[:email]) %>
</div>
<div class="control-group">
  <% if force_superuser_role %>
      <%= f.hidden_field :superuser, value: "1" %>
  <% else %>
      <%= f.label :superuser, t("admin.labels.superuser") %>
      <%= f.check_box :superuser, class: "superuser_checkbox", id: "merchant_employees_attributes_#{index}_superuser", name: "merchant[employees_attributes][#{index}][superuser]"%>
  <% end %>
</div>

Не работает HAML после конвертации:

Это моя ошибка: показывает /Users/project/app/views/shared/_employee.html.haml, где поднята строка № 9:

%h3
  = t("admin.labels.employee")
  = content_tag(:span, employee_counter)
- def create_validation_rules(field_rules)
- Hash[field_rules.map do |rule|
- next ["rule-#{rule[:name]}", rule[:value]] if rule[:value]
- next ["msg-#{rule[:name]}", rule[:msg]] if rule[:msg]
- end] if field_rules
- end
.control-group.form-controls
  = f.label :first_name, t("labels.name")
  = f.text_field :first_name, placeholder: t("labels.first_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_first_name", name: "merchant[employees_attributes][#{index}][first_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:first_name])
  = f.text_field :middle_name, placeholder: t("labels.middle_name"), id: "merchant_employees_attributes_#{index}_middle_name", name: "merchant[employees_attributes][#{index}][middle_name]", autocomplete: "off", maxlength: 100, size: nil
  = f.text_field :last_name, placeholder: t("labels.last_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_last_name", name: "merchant[employees_attributes][#{index}][last_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:last_name])
.control-group
  = f.label :email, t("labels.email_address")
  = f.text_field :email, id: "merchant_employees_attributes_#{index}_email", name: "merchant[employees_attributes][#{index}][email]", autocomplete: "off", maxlength: 250, size: nil, data: create_validation_rules(validations[:email])
.control-group
  - if force_superuser_role
    = f.hidden_field :superuser, value: "1"
  - else
    = f.label :superuser, t("admin.labels.superuser")
    = f.check_box :superuser, class: "superuser_checkbox", id: "merchant_employees_attributes_#{index}_superuser", name: "merchant[employees_attributes][#{index}][superuser]"
31.05.2016

  • Почему вы определяете метод внутри представления??? Вы напрашиваетесь здесь на большие неприятности. 31.05.2016
  • Я мог бы предложить определить эту функцию в другом месте, например, в помощнике или вычислить это значение в контроллере. HAML и ERB не совсем подходят для этой цели. 31.05.2016
  • @ChaseGilliam Действительно, HAML затрудняет определение функции в представлении, потому что функции не должны определяться в представлениях. 31.05.2016

Ответы:


1

правильный способ справиться с этим — определить метод как вспомогательный в вашем контроллере:

class MyController
  helper_method :create_validation_rules

private
  def create_validation_rules(field_rules)
    Hash[field_rules.map do |rule|
      next ["rule-#{rule[:name]}", rule[:value]] if rule[:value]
      next ["msg-#{rule[:name]}", rule[:msg]] if rule[:msg]
    end] if field_rules
  end
end

Это позволит вам вызывать create_validation_rules из представления, не определяя там метод. См. Что именно делают в Rails helper и helper_method? чтобы точно понять, что такое вспомогательный метод и как он работает.


Однако, если вы просто должны использовать встроенный метод в коде View, есть решение: вы можете просто удалить последнюю end во встроенной функции и сделать правильный отступ в теле функции и цикле. .

В этом случае сообщение об ошибке объяснило бы все:

Вам не нужно использовать "- end" в Haml. Уберите отступ, чтобы закрыть блок

Обновляя свой код HAML, это работает:

%h3
  = t("admin.labels.employee")
  = content_tag(:span, employee_counter)
- def create_validation_rules(field_rules)
  - Hash[field_rules.map do |rule|
    - next ["rule-#{rule[:name]}", rule[:value]] if rule[:value]
    - next ["msg-#{rule[:name]}", rule[:msg]] if rule[:msg]
  - end] if field_rules
.control-group.form-controls
  = f.label :first_name, t("labels.name")
  = f.text_field :first_name, placeholder: t("labels.first_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_first_name", name: "merchant[employees_attributes][#{index}][first_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:first_name])
  = f.text_field :middle_name, placeholder: t("labels.middle_name"), id: "merchant_employees_attributes_#{index}_middle_name", name: "merchant[employees_attributes][#{index}][middle_name]", autocomplete: "off", maxlength: 100, size: nil
  = f.text_field :last_name, placeholder: t("labels.last_name"), class: 'js-employeeName', id: "merchant_employees_attributes_#{index}_last_name", name: "merchant[employees_attributes][#{index}][last_name]", autocomplete: "off", maxlength: 50, size: nil, data: create_validation_rules(validations[:last_name])
.control-group
  = f.label :email, t("labels.email_address")
  = f.text_field :email, id: "merchant_employees_attributes_#{index}_email", name: "merchant[employees_attributes][#{index}][email]", autocomplete: "off", maxlength: 250, size: nil, data: create_validation_rules(validations[:email])
.control-group
  - if force_superuser_role
    = f.hidden_field :superuser, value: "1"
  - else
    = f.label :superuser, t("admin.labels.superuser")
    = f.check_box :superuser, class: "superuser_checkbox", id: "merchant_employees_attributes_#{index}_superuser", name: "merchant[employees_attributes][#{index}][superuser]"

Поскольку определение функции, встроенное в код представления ERB, является ненормальным, http://htmltohaml.com не справляется с этим, и просто изверг весь метод в вывод HAML. Хотя это явно неверно, исправить это несложно.


Если вы являетесь хорошим гражданином сети (и поскольку вы уже используете этот инструмент), вы сообщите об этой проблеме разработчику http://htmltohaml.com, чтобы он мог объяснить этот класс проблем генерации HAML.

31.05.2016
  • Я смогу дать вам еще 5 позже сегодня, когда мои голоса будут пополнены. :D 31.05.2016
  • не могли бы вы помочь мне с подобным, я отредактирую свой текущий вопрос, потому что я не могу опубликовать новый 2 дня 01.06.2016
  • @christian Ошибка в том, что end не нужен для блоков content_tag. Если вы просто удалите строки end в строках 13, 17, 21 и т. д., это должно сработать. Когда вы сможете опубликовать новый вопрос, опубликуйте его тогда и откатите этот ответ к исходному, чтобы этот вопрос и ответы не противоречили друг другу. 01.06.2016

  • 2

    Лучший вариант — переместить create_validation_rules в помощника или, по крайней мере, сделать его helper_method в контроллере.

    Чтобы сохранить его в haml, вы должны использовать синтаксис haml для блоков:

    - def create_validation_rules(field_rules)
      - if field_rules
        - Hash.[] field_rules.map do |rule|
          - if rule[:value]
            - next ["rule-#{rule[:name]}", rule[:value]]
          - if rule[:msg]
            - next ["msg-#{rule[:name]}", rule[:msg]]
    
    31.05.2016
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...