2016-05-31 11 views
1

Ich verwendete http://htmltohaml.com/ dies um meine ERB konvertieren und es gibt eine Art von Problem.Fehler nach der Migration von ERB zu HAML

Die ERB Arbeiten vor dem convert

<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> 

Nicht HAML nach dem convert arbeiten:

Das ist mein Fehler: /Users/project/app/views/shared/_employee.html werden angezeigt. haml wo Zeile # 9 angehoben:

%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]" 
+2

Warum definieren Sie eine Methode in der Ansicht ??? Du verlangst hier große Probleme. –

+1

Ich könnte vorschlagen, diese Funktion anderswo zu definieren, wie in einem Helfer oder diesen Wert im Controller zu berechnen. HAML und ERB sind für diesen Zweck nicht wirklich gut geeignet. –

+0

@ChaseGilliam In der Tat macht es HAML schwierig, eine Funktion in einer Ansicht zu definieren, da _Funktionen in Sichten nicht definiert sein sollten. –

Antwort

2

Der richtige Weg zu handhaben ist zu definieren, die Methode als Helfer in Ihrem Controller:

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 

Damit können Sie create_validation_rules aus der Sicht aufrufen, ohne die Methode dort definieren zu müssen. Siehe In Rails, what exactly do helper and helper_method do?, um genau zu verstehen, was eine Hilfsmethode ist und wie sie funktioniert.


Wenn Sie jedoch einfach muss eine eingebettete Methode in der Codeansicht verwenden, gibt es eine Lösung: Sie können einfach die letzte end in der Inline-Funktion, beseitigen und ordnungsgemäß den Körper der Funktion Einzug und die Schleife.

In diesem Fall würde die Fehlermeldung alles erklärt haben:

You don't need to use "- end" in Haml. Un-indent to close a block

aktualisiert HAML Code, das funktioniert:

%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]" 

Als Funktionsdefinition in ERB View-Code eingebettet abnormal ist, http://htmltohaml.com hat es nicht gut gehandhabt und einfach die gesamte Methode in die HAML-Ausgabe zurückgedrängt. Obwohl dies eindeutig falsch ist, ist es eine einfache Angelegenheit, dies zu korrigieren.


Wenn Sie einen guten Netz Bürger sind zu sein (und wie Sie bereits mit dem Werkzeug), werden Sie dieses Problem in den Entwickler von http://htmltohaml.com berichten, so dass er für diese Klasse von HAML Generation ausmachen kann Problem.

+0

Danke! Es funktioniert – christian

+0

Ich habe nicht genug Ruf, um zu wählen :) Das nächste Mal. – christian

+0

Heute kann ich dir 5 weitere geben, wenn meine Stimmen wieder aufgefüllt sind.: D –

1

beste Option create_validation_rules in einen Helfer zu bewegen ist oder zumindest ein helper_method in Controller zu machen.

Um es in haml zu halten - Sie haml Syntax für die Blöcke zu verwenden:

- 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]]