Где я могу поместить этот класс матрицы в моем приложении rails - PullRequest
1 голос
/ 29 января 2012

Я хочу использовать класс матрицы, показанный здесь:

http://rosettacode.org/wiki/Cholesky_decomposition#Ruby

в моем приложении rails.Я скопировал класс в lib / matrix.rb

На странице просмотра я попытался протестировать этот класс с помощью кода:

<%= Matrix[[25,15,-5],[15,18,0],[-5,0,11]].cholesky_factor %>

Однако я получаю сообщение об ошибке:

undefined method `cholesky_factor' for Matrix[[25, 15, -5], [15, 18, 0], [-5, 0, 11]]:Matrix

Что-то я не так делаю?(У меня тоже есть строка 'матрица' в lib / matrix.rb)

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Удалить require 'matrix' из lib/matrix.rb.

Переименуйте в lib/extend_matrix.rb, чтобы мы могли специально загрузить его.

In config/application.rb:

require File.expand_path('../boot', __FILE__)
require 'rails/all'

require 'matrix' # <-- moved here

#...bundler stuff...

module MyApp # <-- don't overwrite this!
  class Application < Rails::Application
     # ...
    config.autoload_paths << "#{::Rails.root.to_s}/lib" # <-- set path
    require "extend_matrix" # <-- forcibly load your matrix extension
  # ...

Уведомление #{::Rails.root.to_s}. Использование .to_s имеет решающее значение, поскольку ::Rails.root возвращает объект Pathname. Без этого вы будете добавлять /lib (системный уровень) к пути автозагрузки. Мы хотим /path/to/rails/lib (уровень приложения).

Не забудьте перезапустить сервер.


Вот так я заставил его работать на меня. Если кто-нибудь знает, как это сделать без статических требований, делитесь. Я уверен, что это можно сделать динамически.

0 голосов
/ 29 января 2012

Мне кажется, проблема в том, что lib / matrix.rb никогда не читается.Если вы используете Rails 3, файлы в каталоге dir не загружаются автоматически.Как предложено в этом ответе , добавьте следующую строку в ваш application.rb и перезагрузите сервер:

config.autoload_paths += Dir["#{config.root}/lib/**/"] # include all subdirectories
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...