从 ERB 迁移到 HAML 后出错
Error after migration from ERB to 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]"
最好的选择是将 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]]
处理此问题的正确方法是将方法定义为控制器中的帮助程序:
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
,而不必在那里定义方法。请参阅 In Rails, what exactly do helper and helper_method do? 以准确了解什么是辅助方法及其工作原理。
但是,如果你只是必须在View代码中使用嵌入的方法,有一个解决方案:你可以简单地去掉内联函数中的最后一个end
, 并适当缩进函数体和循环。
在这种情况下,错误消息可以解释一切:
You don't need to use "- end" in Haml. Un-indent to close a block
正在更新您的 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 的开发者,以便他可以解决这个问题 class 的 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]"
最好的选择是将 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]]
处理此问题的正确方法是将方法定义为控制器中的帮助程序:
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
,而不必在那里定义方法。请参阅 In Rails, what exactly do helper and helper_method do? 以准确了解什么是辅助方法及其工作原理。
但是,如果你只是必须在View代码中使用嵌入的方法,有一个解决方案:你可以简单地去掉内联函数中的最后一个end
, 并适当缩进函数体和循环。
在这种情况下,错误消息可以解释一切:
You don't need to use "- end" in Haml. Un-indent to close a block
正在更新您的 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 的开发者,以便他可以解决这个问题 class 的 HAML 生成问题。