Ruby / Rails: доступ к переменной внутри .each в моем массиве переменных экземпляра вызывает сбой интерпретатора Ruby - PullRequest
3 голосов
/ 06 сентября 2011

Я написал миксин (основанный на том, что я прочитал в блоге), который, кажется, вызывает проблему

Вот ссылка на проект: http://www.filehosting.org/file/details/263759/onlinescheduler.zip (или пришлите мнеэлектронное письмо: aaron.a.ashworth@gmail.com, и я отправлю его по электронной почте), и я вычеркнул столько, сколько смогу, чтобы он все еще вызывал проблему.Ключевые файлы, на которые нужно посмотреть:

/lib/user_role.rb (near line 11)
/app/views/customers/index.html.erb (near line 16)
/app/controllers/customers_controller.rb (near line 47)

Здесь я также размечу важные вещи:

/lib/user_role.rb:

module UserRole
    def self.included(base)
      base.has_one :user, :as => :user_role, :autosave => true
      base.validate :user_must_be_valid
      base.alias_method_chain :user, :autobuild
      base.extend ClassMethods
      base.define_user_accessors
    end

    def user_with_autobuild
      user_without_autobuild || build_user
    end

    def method_missing(meth, *args, &blk)
      user.send(meth, *args, &blk)
    rescue NoMethodError
      super
    end

    module ClassMethods
      def define_user_accessors
        all_attributes = User.content_columns.map(&:name) + ["password", "password_confirmation"]
        ignored_attributes = ["created_at", "updated_at", "user_role_type"]
        attributes_to_delegate = all_attributes - ignored_attributes
        attributes_to_delegate.each do |attrib|
          class_eval <<-RUBY
            def #{attrib}
              user.#{attrib}
            end

            def #{attrib}=(value)
              self.user.#{attrib} = value
            end

            def #{attrib}?
              self.user.#{attrib}?
            end
          RUBY
        end
      end
    end

  protected
    def user_must_be_valid
      Logger.new(STDOUT).info('calling user_must_be_valid')
      unless user.valid?
        user.errors.each do |attr, message|
          errors.add(attr, message)
        end
      end
    end
  end

app/views/customers/index.html.erb:

...
<% @customers.each do |customer| %>
  <tr>
    <td><%= customer.account_id %></td>
...

доступ к customer вообще вызывает проблему.Я могу сделать что угодно с @customers, но как только я пытаюсь получить доступ к customer.... или даже @customers[0]...., у меня возникает проблема.

Шаги для получения

1) После распаковки файла перейдите в корневой каталог терминала и выполните следующие команды:

bundle install
bundle exec rake db:drop
bundle exec rake db:migrate
rails s

2) Откройте браузер на localhost:3000/customers и нажмите New Customer

3)Заполните форму, которую вы видите следующим образом:

Account: 3
First Name: First
Last Name: Last
Email: first.last@domain.com
Password: 1234
Password confirmation: 1234

4) Нажмите кнопку Create Customer.

Ожидаемое поведение

Вы должны бытьперенаправлено на localhost:3000/customers/1

Текущее поведение

Сбой веб-сервера при появлении следующего сообщения:

~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x17b356) [0x7fef4a97e356]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x1713ee) [0x7fef4a9743ee]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x177243) [0x7fef4a97a243]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_vm_invoke_proc+0x9f) [0x7fef4a97b08f]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x17b644) [0x7fef4a97e644]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x1713ee) [0x7fef4a9743ee]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x177243) [0x7fef4a97a243]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x1784f4) [0x7fef4a97b4f4]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x178cb5) [0x7fef4a97bcb5]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x17b50d) [0x7fef4a97e50d]
~/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x1713ee) [0x7fef4a9743ee]

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Перезапуск веб-сервера и переход кlocalhost:3000/customers иногда выдает другую ошибку.Ошибка сегментации, и она жалуется на /lib/user_role.rb:11

Среда

Ruby 1.9.2-p290
Rails 3.0.9
RVM 1.8.1
Ubuntu 11.04

Редактировать

Что следует отметить: Есливы пытаетесь работать с тем же кодом, что и бомбы в консоли, это нормально.Пример:

(After entering rails c)
@customers = Customer.all
@customers.each do |customer|
  p customer.account_id
end
# this doesn't cause an error or crash.

@customer[0].first_name
=> "First"

1 Ответ

3 голосов
/ 08 сентября 2011

Если вы удалите:

def method_missing(meth, *args, &blk)
  customer.send(meth, *args, &blk)
rescue NoMethodError
  super
end

и

def method_missing(meth, *args, &blk)
  user.send(meth, *args, &blk)
rescue NoMethodError
  super
end

из файлов x_role в вашей директории lib, все должно работать нормально. Обратите внимание на унаследованный ресурс для ваших контроллеров и простую форму для ваших форм.

...