【问题标题】:undefined method `i18n_key' for Address:Class地址:类的未定义方法“i18n_key”
【发布时间】:2014-08-07 20:59:22
【问题描述】:

我在加载包含表单(如 edit.html.erb 或 new.html.erb)的页面时收到此错误。它冻结在标签上。我需要强调的是,我没有在我的应用程序中使用 ActiveRecord 作为 ORM,而是使用 Perpeuity gem,它是 Datamapper 模式的实现。留下 Activerecord 已经证明有点问题,所以也许有人可以提供帮助。

表格部分:

<%= form_for(@address) do |f| %>
<% if @address.errors.to_a.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@address.errors.count, "error") %> prohibited this address from being saved:</h2>

      <ul>
        <% @address.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
<% end %>

<div class="row collapse">
  <div class="small-3 columns">
    <% require 'debugger'; debugger %>
    <%= f.label :line1, class: "right inline" %>
  </div>
  <div class="small-7 columns left">
    <%= f.text_field :line1 %>
  </div>
</div>

<div class="row collapse">
  <div class="small-3 columns">
    <%= f.label :line2, class: "right inline" %>
  </div>
  <div class="small-7 columns left">
    <%= f.text_field :line2, :placeholder => "(optional)"  %>
  </div>
</div>
<div class="row collapse">
  <div class="small-3 columns">
    <%= f.label :postcode, class: "right inline" %>
  </div>
  <div class="small-7 columns left">
    <%= f.select :postcode, Address::POSTCODES, :prompt => 'Select a postcode (optional)' %>
  </div>
</div>
<div class="row collapse">
  <div class="small-3 columns">
    <%= f.label :city, class: "right inline" %>
  </div>
  <div class="small-7 columns left">
    <%= f.text_field :city %>
  </div>
</div>
<div class="row collapse">
  <div class="small-3 columns">
    <%= f.label :county, class: "right inline" %>
  </div>
  <div class="small-7 columns left">
    <%= f.select :postcode, Address::COUNTIES, :prompt => 'Select a county (optional)' %>
  </div>
</div>
<div class="row collapse">
  <div class="small-9 small-offset-3 columns">
    <%= f.submit %>
  </div>
</div>

型号:

class Address
  extend ActiveModel::Naming
  extend ActiveModel::Translation
  include Perpetuity::RailsModel

  def errors
    @errors ||= ActiveModel::Errors.new(self)
  end

  def read_attribute_for_validation(attr)
    send(attr)
  end

 def save
   validate!
   errors.empty? ? super : false
 end

 def validate!
   #place custom validations here e.g.
   errors.add(:name, "cannot be blank.") if self.name = ""
   errors.add(:number,"must be less than 7.") if self.number >= 7
 end

 attr_accessor :name, :city, :county, :line1, :line2, :postcode
 attr_reader   :errors

end

具有相关方法的控制器:

class AddressesController < ApplicationController

  def new
    @address = Address.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @address }
    end
  end

  def edit
    #require 'debugger'; debugger
    @address = Perpetuity[Address].find(params[:id])
  end

  def create
    @address = Address.new(params[:address])
    Perpetuity[Address].insert @address

    respond_to do |format|
      if @address.save
        format.html { redirect_to @address, notice: 'Address was successfully created.' }
        format.json { render json: @address, status: :created, location: @address }
      else
        format.html { render action: "new" }
        format.json { render json: @address.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    @address = Perpetuity[Address].find(params[:id])

    respond_to do |format|
      if @address.update_attributes(params[:address])
        format.html { redirect_to @address, notice: 'Address was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @address.errors, status: :unprocessable_entity }
      end
    end
  end
end

我使用的是 Rails 3.2,安装的 ActiveModel gem 版本为 3.2.13。我查看了 gem 代码,但在其中找不到方法 i18n_key,而此处的文档 [link]http://www.rubydoc.info/docs/rails/3.1.1/ActiveModel/Name:i18n_key 表明它应该在其中(类似地在 3.2.8 文档中)。这是一个错误还是我做错了什么?感谢您的帮助。

【问题讨论】:

  • 实际上扩展 ActiveModel::Naming 和扩展 ActiveModel::Translation 可能不应该存在,但一旦我删除它们,我会得到地址:类的未定义方法“人类”。无论哪种方式都不好......
  • 看起来您发现了 Perpetuity::RailsModel 类不支持的另一件事。我什至不知道 ActiveModel 有 i18n 集成。 API doc site 不用提了。我会看看我能用它做什么。你还记得是哪条线路呼叫i18n_key吗?

标签: ruby-on-rails ruby ruby-on-rails-3 activemodel


【解决方案1】:

我收到了这个错误,结果证明我在我的一个类中使用了似乎是保留关键字的东西。就我而言,它是model_name

重命名它为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多