0

Мне нужна помощь с виртуальными атрибутами. Этот код отлично работает, но как его использовать внутри плагина. Цель состоит в том, чтобы добавить эти методы ко всем классам, использующим плагин.Виртуальные атрибуты в плагине

class Article < ActiveRecord::Base 

    attr_accessor :title, :permalink 

    def title 
    if @title 
     @title 
    elsif self.page 
     self.page.title 
    else 
     "" 
    end 
    end 

    def permalink 
    if @permalink 
     @permalink 
    elsif self.page 
     self.page.permalink 
    else 
     "" 
    end 
    end 
end 

Благодаря

ответ

1

Вы можете запустить генератор плагинов, чтобы начать работу.

script/generate plugin acts_as_page 

Вы можете добавить модуль, который определяет acts_as_page и расширяет его на все модели.

# in plugins/acts_as_page/lib/acts_as_page.rb 
module ActsAsPage 
    def acts_as_page 
    # ... 
    end 
end 

# in plugins/acts_as_page/init.rb 
class ActiveRecord::Base 
    extend ActsAsPage 
end 

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

module ActsAsPage 
    def acts_as_page 
    attr_writer :title, :permalink 
    include Behavior 
    end 

    module Behavior 
    def title 
     # ... 
    end 

    def permalink 
     # ... 
    end 
    end 
end 

И тогда, когда вы звоните acts_as_page в модели ...

class Article < ActiveRecord::Base 
    acts_as_page 
end 

Он определяет атрибуты и добавить методы. Если вам нужно, чтобы вещи были немного более динамичными (например, если вы хотите, чтобы метод acts_as_page принимал аргументы, которые меняли поведение), попробуйте решение, которое я представляю в this Railscasts episode.

+0

Спасибо за ваш ответ, но я получаю эту ошибку: active_record/base.rb: 1959: в 'method_missing ': частный метод' attr_writer' называется для ActiveRecord :: Base: Класс (NoMethodError) Позвольте мне быть более конкретны: Я хочу, чтобы иметь возможность добавить это к моей модели: acts_as_page Каждая модель, которая использует этот плагин должен получить два виртуальных атрибутов (название и Permalink), который используется для создания или обновления модели страницы в before_save обратный вызов внутри плагина. Все работает нормально, но я не получаю значения названия и постоянной ссылки. Я бы вставлял код, но у меня заканчиваются символы :) –

+0

Я обновил ответ, чтобы он соответствовал вашим требованиям. Я забыл, что attr_writer был закрыт, но это не должно быть проблемой с этим новым решением. – ryanb

+0

Большое спасибо! Я забыл, что мне нужно расширить модуль в ActiveRecord. –

0

Похоже, что вы хотите модуль для этого

# my_methods.rb 
module MyMethods 
    def my_method_a 
    "Hello" 
    end 
end 

, который вы хотите включить его в классы, которые вы хотите использовать его для.

class MyClass < ActiveRecord::Base 
    include MyMethods 
end 

> m = MyClass.new 
> m.my_method_a 
=> "Hello!" 

Посмотрите here для получения дополнительной информации о смешивании в модулях. Вы можете поместить модуль где угодно в плагин, если хотите, просто убедитесь, что его имя правильно, поэтому Rails может его найти.

0

Создать структуру модуля, как YourPlugin::InstanceMethods и включить его этот модуль так:

module YourPlugin 
    module InstanceMethods 
    # your methods 
    end 
end 

ActiveRecord::Base.__send__(:include, YourPlugin::InstanceMethods) 

Вы должны использовать __send__, чтобы сделать свой код на Ruby 1.9 совместимы. Строка __send__ обычно помещается в файл init.rb в корневой каталог плагина.