代码之家  ›  专栏  ›  技术社区  ›  JP Silvashy Gautam Rege

Rails,从类名获取类?

  •  1
  • JP Silvashy Gautam Rege  · 技术社区  · 14 年前

    我这里有一个问题,我试图在一个未知的对象上调用类方法…唔,我不知道如何表述这个词,我从url中获取:资源,但我也希望在它上运行find以获得不同的参数。

    我该怎么做?

    params[:resource].classify.find(params[:id])
    

    我的意思是这不起作用,因为 params[:resource].classify 将是一个字符串。但是我如何在上面运行一个方法,就好像它是 Class 不是一根绳子?

    以下几条过去很好,但宝石 friendly_id 我打了所有的电话给一个记录,以返回它的友好ID,而不是它的实际主键…真糟糕。

    它是这样做的,效果很好:

    @vote = Vote.new({
      :vote => params[:direction] == 'up' ? true : false,
      :voteable_type => params[:resource].classify,
      :voteable_id => params[:id])
    })
    

    但自从添加 友好的身份证 我的路径现在看起来像:

    /things/my-thing-name/vote/up
    

    而不是老办法:

    /things/328/vote/up
    

    所以现在 params[:id] 不再是外键。

    思想?

    2 回复  |  直到 14 年前
        1
  •  3
  •   theIV    14 年前

    我对你的问题有点困惑,好像是2。

    对于第1部分,您可以 constantize . params[:resource].classify.constantize 应该返回类名,然后可以对其调用方法。为了安全,你可能想 tableize 之前 康斯坦兹 嗯,只是为了确保像“—”这样的东西是“—”。我之所以这么说是因为你 friendly_id 设置。

    至于第二部分,我不知道 友好的身份证 gem,但基于它如何工作的描述 the guide 你的发现应该还能正常工作,除非我找不到东西。

        2
  •  3
  •   jordinl    14 年前

    第一件事是“参数[:资源]。分类”您需要做的

    params[:resource].constantize
    

    在第二种情况下,你应该做如下的事情:

    @thing = Thing.find_by_friendly_id(params[:friendly_id])