DATE 字段的 Rails 脚手架问题

Posted

技术标签:

【中文标题】DATE 字段的 Rails 脚手架问题【英文标题】:Problem in Rails scaffold for DATE fields 【发布时间】:2010-11-26 01:17:32 【问题描述】:

当我使用 Rails 脚手架时,我无法访问页面来编辑字段。它向我展示了所有 DATE 字段的某种问题。这是错误:

can't convert Symbol into String

Extracted source (around line #124):

    121:   </p>
    122:   <p>
    123:     <%= f.label :dataDeCadastro %><br />
    124:     <%= f.date_select :dataDeCadastro %>

以及stackTrace的一部分:

/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/date_helper.rb:564:in `include?'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/date_helper.rb:564:in `select_date'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/date_helper.rb:832:in `to_date_select_tag_without_error_wrapping'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/active_record_helper.rb:268:in `to_date_select_tag'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/date_helper.rb:179:in `date_select'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/date_helper.rb:889:in `date_select'
app/views/usuarios/edit.html.erb:124
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/form_helper.rb:313:in `fields_for'
/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/form_helper.rb:253:in `form_for'
app/views/usuarios/edit.html.erb:3

以及模型sql:

CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usuario` varchar(50) DEFAULT NULL,
  `recebeNews` smallint(1) DEFAULT NULL,
  `cidade` varchar(30) DEFAULT NULL,
  `email` varchar(40) DEFAULT NULL,
  `endereco` varchar(70) DEFAULT NULL,
  `estado` varchar(3) DEFAULT NULL,
  `cep` varchar(10) DEFAULT NULL,
  `numero` varchar(10) DEFAULT NULL,
  `telefone` varchar(30) DEFAULT NULL,
  `cnpj` varchar(20) DEFAULT NULL,
  `cpf` varchar(18) DEFAULT NULL,
  `inscricaoEstadual` varchar(20) DEFAULT NULL,
  `rg` varchar(15) DEFAULT NULL,
  `complemento` varchar(70) DEFAULT NULL,
  `sexo` varchar(1) DEFAULT NULL,
  `bairro` varchar(70) DEFAULT NULL,
  `telefoneResidencial` varchar(10) DEFAULT NULL,
  `dddTelefoneCelular` varchar(2) DEFAULT NULL,
  `dddTelefoneComercial` varchar(2) DEFAULT NULL,
  `dddTelefoneResidencial` varchar(2) DEFAULT NULL,
  `ramalDoTelefoneComercial` varchar(10) DEFAULT NULL,
  `telefoneCelular` varchar(10) DEFAULT NULL,
  `telefoneComercial` varchar(10) DEFAULT NULL,
  `creditoPessoal` smallint(1) DEFAULT NULL,
  `descontoPessoal` smallint(1) DEFAULT NULL,
  `motivoDoBloqueio` varchar(255) DEFAULT NULL,
  `nomeNaReceitaFederal` varchar(255) DEFAULT NULL,
  `valorDoCreditoPessoal` double DEFAULT NULL,
  `valorDoDescontoPessoal` double DEFAULT NULL,
  `bloqueio` smallint(1) DEFAULT NULL,
  `dataDeCadastro` datetime DEFAULT NULL,
  `dataLimiteDoDescontoPessoal` datetime DEFAULT NULL,
  `situacaoNaReceitaFederal` varchar(255) DEFAULT NULL,
  `dataDeNascimento` datetime DEFAULT NULL,
  `senha` varchar(255) DEFAULT NULL,
  `interior` smallint(1) DEFAULT NULL,
  `observacao` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=5754 DEFAULT CHARSET=latin1 ;

完整查看源代码:

<% form_for(@usuario) do |f| %>
<%= f.error_messages %>

<p>
  <%= f.label :usuario %>
  <%= f.text_field :usuario %>
</p>
<p>
  <%= f.label :cpf, "CPF" %>
  <%= f.text_field :cpf %>
</p>
<p>
  <%= f.label :rg, "RG" %>
  <%= f.text_field :rg %>
</p>
<p>
  <%= f.label :cnpj, "CNPJ" %>
  <%= f.text_field :cnpj %>
</p>
<p>
  <%= f.label :sexo, "Sexo" %><br>
  <%= f.radio_button :sexo, :M %>M<br>
  <%= f.radio_button :sexo, :F %>F
</p>
<p>
  <%= f.label :dataDeNascimento, "Data de Nascimento" %>

  <%= f.date_select :dataDeNascimento %>
</p>
<p>
  <%= f.label :endereco %>
  <%= f.text_field :endereco %>
</p>
<p>
  <%= f.label :cidade, "Cidade" %>
  <%= f.text_field :cidade %>
</p>
<p>
  <%= f.label :estado, "Estado" %>
  <%= f.text_field :estado, :maxlength => "2" %>
</p>
<p>
  <%= f.label :cep, "CEP" %>
  <%= f.text_field :cep, :maxlength => "10" %> (00000-000)
</p>
<p>
  <%= f.label :telefone, "Telefone" %>
  <%= f.text_field :telefone %>
</p>
<p>
  <%= f.label :email %>
  <%= f.text_field :email %>
</p>
<p>
  <%= f.label :senha, "Senha" %>
  <%= f.password_field :senha %>
</p>
<p>
  <%= f.label :senha_confirmation, "Confirmação da Senha" %>
  <%= f.password_field :senha_confirmation %>
</p>
<p>
  <%= f.label :recebeNews %><br />
  <%= f.check_box :recebeNews %>
</p>
<p>
  <%= f.submit "Enviar" %>
</p>
<% end %>

会是什么?

【问题讨论】:

【参考方案1】:

我在this link 和这个one 上找到了解决方案:

当您在您的应用程序中设置 I18n.locale 到不同的东西 比“en”,你有以下 您认为的简单代码:

 <%= date_select("user_info", "birthdate") %> 

你会得到不能将符号转换为字符串的 date_select 助手。问题可能是 通过给出 date_select 获救 像这样的辅助命令:

 <%= date_select("user_info", "birthdate", :order => [:day,:month,:year]) %> 

或者通过在通常位于 config/locales/your_lang.yml 的 yml 文件中进行排序 这个

date:   
  formats: 
    default: ""
    long: ""
    short: ""
  order:
    - :year
    - :month
    - :day

【讨论】:

这显然解决了错误,但之后会出现其他问题,例如缺少月份翻译。我建议有这个问题的人从github.com/svenfuchs/rails-i18n/tree/master/rails/locale复制整个日期树【参考方案2】:

这很可能是由本地化引起的。您输入了与 :en 不同的标准语言环境(在 application.rb 或 environment.rb 中),但您没有为月份名称声明适当的翻译,导致 rails 停止。您可以从GitHub下载标准翻译文件。

【讨论】:

【参考方案3】:

能否也显示错误消息?

更新:

<p>
  <%= f.label :dataDeNascimento, "Data de Nascimento" %>

  <%= f.date_select "dataDeNascimento" %>
</p>

或者试试这个:

<p>
  <%= f.label :dataDeNascimento, "Data de Nascimento" %>

  <%= date_select "usario", "dataDeNascimento" %>
</p>

【讨论】:

请给我看完整的表格代码。在问题文本中看到您的 sql 语句作为格式化代码会很好。 也许你应该尝试传递一个字符串而不是一个符号...见上面的代码

以上是关于DATE 字段的 Rails 脚手架问题的主要内容,如果未能解决你的问题,请参考以下文章

rails脚手架形式,添加字段的最简单方法?

Rails Scaffold 方法的最佳实践

如何在 Rails 验证错误中突出显示字段

Rails 3 拐点问题

Ruby/Rails:生成脚手架的代码在哪里

在 Rails 中撤消脚手架