2016-06-25 3 views
0

Ruby on Rails CMSを少し書いています。構築済みのCMSデータモデルを継承したモデルを作成するジェネレータを作りたいと思います。たとえば、CMSにEntryモデルがあり、このモデルの子モデルのPostモデルを作成したいとします。これは、ソースコードである:あらかじめ構築されたモデルを継承したモデルのジェネレータを作成する

デシベル/移行/ * create_mycms_entries.rb

class CreateMyCmsEntries < ActiveRecord::Migration[5.0] 
    def change 
    create_table :my_cms_entries do |t| 
     t.string :type, index: true 
     t.string :title 
     t.string :slug, index: true 
     t.json :payload 
     t.integer :user_id, index: true 
     t.string :author_name 

     t.datetime :published_at 
     t.timestamps null: false 
    end 
    end 
end 

がentry.rb

module MyCms 
    class Entry < ActiveRecord::Base 
    scope :published, -> { where('published_at <= ?', Time.zone.now) } 

    def self.content_attr(attr_name, attr_type = :string) 
     content_attributes[attr_name] = attr_type 

     define_method(attr_name) do 
     self.payload ||= {} 
     self.payload[attr_name.to_s] 
     end 

     define_method('#{attr_name}='.to_sym) do |value| 
     self.payload ||= {} 
     self.payload[attr_name.to_s] = value 
     end 
    end 

    def self.content_attributes 
     @content_attributes ||= {} 
    end 
    end 
end 

と、私のブログ側では、ポスト.rb

class Post < MyCms::Entry 
    content_attrs :body, :text 

    # Rest of the stuff... 
end 

は、私はこのような最後のコマンドを見て何かしたい:

$ rails generate entry Post body:text 

をしかし、私は、私はそれを実装する方法を知ってかなりよく分かりません。

答えて

1

あなたは、このコマンドを入力して、ここに

http://guides.rubyonrails.org/generators.html

まず最初に文書化しているチームをレールトール(https://github.com/erikhuda/thor)を使用することができますジェネレータを生成するためにジェネレータをトリガしています:)。あなたのコマンドを実行した後にこのような何かを得るでしょう

create lib/generators/entry 
create lib/generators/entry/entry_generator.rb 
create lib/generators/entry/USAGE 
create lib/generators/entry/templates 

次に、あなただけのActiveRecordのは、モデルを作成するために持っているコードをコピーしている何ができますか。 、

class <%= class_name %> < <%= parent_class_name.classify %> 

CLASS_NAMEがあなたの発電機に渡す変数である:あなたのテンプレート内には、あなたはそれがこのような何かを持っていることがわかります

https://github.com/rails/rails/blob/master/activerecord/lib/rails/generators/active_record/model/templates/model.rb

ここのように、このファイルmodel.rbを持っていますあなたの例のように。そして、あなたは、レール・ジェネレータは、あなたが必要なすべてを持っているので、私は間違いなくあなたがこのファイルを見ることをお勧めしますあなたのentry_generator

argument :class_name, type: :string, default: "Post" 

の内側に、このようにそれを定義することができます...あなたは自分の特定のニーズに合わせてカスタマイズします:ジェネレータで

https://github.com/rails/rails/blob/master/activerecord/lib/rails/generators/active_record/model/model_generator.rb

テンプレートを呼び出すクラスを持っています。 Ryan Bytesの別のビデオでは、カスタムレイアウトでジェネレータを作成する方法について説明しています。

http://railscasts.com/episodes/218-making-generators-in-rails-3?view=asciicast

権について見える幸運

+0

ありがとう!それはまさに私が必要なものです! – AlexNikolaev94

1

あなたがしようとしているのは、シングルテーブル継承(STI)です.Railsはこれをサポートしています。基本的には、entriesテーブルにカラムtypeが必要です。これは階層内にクラス名を格納します。あなたの例のように、親属性を使う必要はありません。 Rails docsまたはブログ(例: this one。だから、

bin/rails g generator entry 

:カスタムモデルジェネレータを作成したい場合は

+0

。 –

関連する問題