从另一个控制器访问模型方法中的实例变量的正确方法是什么?

时间:2013-10-16 20:02:14

标签: ruby-on-rails

我创建了一些脚手架来管理将按索引组织的音频剪辑:

rails generate scaffold Clips name:string

我将所有剪辑上传到我的文件服务器,并使用自动生成的rails控制面板将它们添加到数据库中。

现在,我需要能够访问它们,所以我在模型中添加了一个url方法:

class Clip < ActiveRecord::Base
    def self.url
        "http://example.file_server.com/audio-clips/#{@id}.mp3"
    end
end

现在,在控制器中运行站点本身,调用此方法看起来像输出除了id之外的所有内容....

class TwilioController < ApplicationController
    def index

        Twilio::TwiML::Response.new do |r|
            @response = r.play Clip.where(name: "root").url
        end

        render :xml => @response
    end
end

输出:

<Response>
<play>http://example.file_server.com/audio-clips/.mp3</play>
</Response>

如何将id插入到URL字符串中?

1 个答案:

答案 0 :(得分:1)

一些事情,一个,您将url定义为self.url,这使它成为一个类级方法。我猜你不想这样做。

另外,不要将id用作实例变量,请使用其生成的访问器方法:

class Clip < ActiveRecord::Base
  def url
    "http://example.file_server.com/audio-clips/#{id}.mp3"
  end
end

此外,您在url调用之后立即调用where,这会返回一个关系。你会想要做的事情:

Twilio::TwiML::Response.new do |r|
  @response = r.play Clip.where(name: "root").first.url
end

但这更多地取决于你在做什么。如果您希望有多个结果,则必须以不同方式处理它。还要注意它可能没有结果......