tôi hy vọng để thực hiện một cái gì đó giống như tất cả các plug-in tuyệt vời có cho ruby, vì vậy mà bạn có thể làm điều này:Vượt qua các đối số cho mô-đun có trong Ruby?
acts_as_commentable
has_attached_file :avatar
Nhưng tôi có một hạn chế:
Đó phương pháp helper thể chỉ bao gồm một mô-đun; nó không thể xác định bất kỳ biến hoặc phương thức nào.
Lý do cho điều này là bởi vì, tôi muốn các tùy chọn băm để xác định cái gì đó như type
, và có thể được chuyển đổi thành một trong nói 20 module khác nhau 'ngựa thồ', tất cả trong số đó tôi có thể tổng hợp trong một dòng như thế này:
def dynamic_method(options = {})
include ("My::Helpers::#{options[:type].to_s.camelize}").constantize(options)
end
Sau đó, những 'workhorses' sẽ xử lý các tùy chọn, làm những việc như:
has_many "#{options[:something]}"
đây là những gì cấu trúc như thế nào, và tôi tự hỏi nếu bạn biết t ông mất tích mảnh trong câu đố:
# 1 - The workhorse, encapsuling all dynamic variables
module My::Module
def self.included(base)
base.extend ClassMethods
base.class_eval do
include InstanceMethods
end
end
module InstanceMethods
self.instance_eval %Q?
def #{options[:my_method]}
"world!"
end
?
end
module ClassMethods
end
end
# 2 - all this does is define that helper method
module HelperModule
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def dynamic_method(options = {})
# don't know how to get options through!
include My::Module(options)
end
end
end
# 3 - send it to active_record
ActiveRecord::Base.send(:include, HelperModule)
# 4 - what it looks like
class TestClass < ActiveRecord::Base
dynamic_method :my_method => "hello"
end
puts TestClass.new.hello #=> "world!"
Đó %Q?
Tôi không hoàn toàn chắc chắn làm thế nào để sử dụng, nhưng tôi về cơ bản chỉ là muốn bằng cách nào đó có thể vượt qua options
băm từ đó phương pháp helper vào module Workhorse . Điều đó có thể không? Bằng cách đó, mô-đun workhorse có thể định nghĩa tất cả các loại chức năng, nhưng tôi có thể đặt tên cho các biến bất cứ điều gì tôi muốn trong thời gian chạy.
Bạn có thể giải thích về cách thức điều này có thể hữu ích trong trường hợp này không?Nó có thể là hiển nhiên đối với bạn, nhưng câu trả lời hay trên trang web này bao gồm loại thông tin này. Một con trỏ không có giải thích không thực sự là câu trả lời .... – GreenAsJade
Đó là actions_as DSL cho lớp ruby. Bạn có thể chuyển trường và tùy chọn thành hành động (mô-đun), ví dụ: actions_as_searchable: title, ignorecase: true –