неопределенный метод `i18n_key' для Address:Class

Я получаю эту ошибку, когда загружаю страницу, содержащую форму (например, edit.html.erb или new.html.erb). Застывает на этикетках. Я должен подчеркнуть, что я использую не ActiveRecord в качестве ORM в своем приложении, а гем Perpeuity, который является реализацией шаблона 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 имеет версию 3.2.13. Я просмотрел код gem и не могу найти в нем метод i18n_key, а эта документация здесь [link]http://www.rubydoc.info/docs/rails/3.1.1/ActiveModel/Name:i18n_key указывает, что он должен быть там (аналогично этому в 3.2.8 документы). Это баг или я что-то не так делаю? Спасибо за вашу помощь.


person evoo    schedule 07.08.2014    source источник
comment
На самом деле расширения ActiveModel::Naming и расширения ActiveModel::Translation, вероятно, не должны быть там, но как только я их удаляю, я получаю неопределенный метод `human' для Address:Class. В любом случае это плохо...   -  person evoo    schedule 08.08.2014
comment
Похоже, вы нашли еще одну вещь, которую не поддерживает класс Perpetuity::RailsModel. Я даже не знал, что у ActiveModel есть интеграция с i18n. На сайте с документацией по API это не упоминается. Я посмотрю, что я могу сделать с ним. Вы помните, по какой линии звонил i18n_key?   -  person jamie_gaskins    schedule 17.08.2014


Ответы (1)


Я получал эту ошибку, и оказалось, что я использовал зарезервированное ключевое слово в одном из своих классов. В моем случае это было model_name

Переименование решило проблему для меня.

person Josh    schedule 24.11.2015