簡體   English   中英

如何檢查參數是模型的實例還是Rails中的類?

[英]How do I check if an argument is an instance of model or the class in Rails?

我有一個幫助方法,為資源生成“crud”鏈接。 現在它只處理編輯和銷毀。 但我想重構它,以便在傳遞模型類而不是實例時創建new鏈接。

期望的輸出:

> crud_links_for_resource(Product)
> { :new => '<a href="/products/new">Create a new product.</a>'}

檢查變量是模型類還是實例的最佳方法是什么? 我想過使用duck typing( resource.respond_to? :new_record? )但是有更好的方法嗎?

module PermissionsHelper
  # Generates a hash of links to edit or destroy a resource
  # @param [ActiveModel] resource
  # @param [Actions] a list of crud actions to create links to
  # @param [Hash] kwargs optional hash to pass to link to
  # @option kwargs [String] :controller - controller name to use.
  #   Otherwise a guess is performed based on the resource class name.
  # @option kwargs [Hash] url_extras - passed to url_for. Can be used for nested resources.
  # @return [Hash] a list of links to actions which the user is allowed to perform
  def crud_links_for_resource(resource,  actions = [:destroy, :edit], **kwargs)
    privledges = actions.keep_if { |action| can? action, resource }
    privledges.each_with_object({}) do |action, hash|
      i18n_key = resource.model_name.i18n_key
      txt = t("#{ i18n_key }.#{action}")
      controller = kwargs[:controller] || i18n_key.to_s.pluralize
      url_extras = kwargs[:url_extras] || {}
      options = kwargs.except(:controller, :url_extras)
      case action
        when :destroy
          options.merge!(method: :delete, confirm: t("#{ i18n_key }.confirm_#{action}"))
        else
      end
      hash[action] = link_to(txt, { action: action, controller: controller, id: resource }.merge(url_extras) ,options)
    end
  end
end
if myobject.is_a?(Foo)
  #it's an instance of foo
else
  #it's something else
end

要么

if myobject.is_a?(Class)
  #it's a class
else
  #it's not
end

如果你想確保有問題的對象不僅是任何類而是模型類 - 即ActiveRecord::Base的(直接或間接)后代:

my_object.is_a?(Class) && my_object < ActiveRecord::Base

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM