Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 100%新问题-send()方法_Ruby On Rails_Ruby_Send - Fatal编程技术网

Ruby on rails Rails 100%新问题-send()方法

Ruby on rails Rails 100%新问题-send()方法,ruby-on-rails,ruby,send,Ruby On Rails,Ruby,Send,有人能帮我理解下面列出的“send()”方法的用途吗?当我阅读下面的代码时,它的用途毫无意义 这是一个使用Ruby 1.8.7和Rails 1.2.3的Rails应用程序。请不要对我唠叨升级,这是客户的环境,所以我没有那种闲暇时间 不过,不用说,我所指的声明是这样的 def do_schedule @performance = Performance.new(params[:performance]) @performer = Performer.find(params[:perform

有人能帮我理解下面列出的“send()”方法的用途吗?当我阅读下面的代码时,它的用途毫无意义

这是一个使用Ruby 1.8.7和Rails 1.2.3的Rails应用程序。请不要对我唠叨升级,这是客户的环境,所以我没有那种闲暇时间

不过,不用说,我所指的声明是这样的

def do_schedule
  @performance = Performance.new(params[:performance])
  @performer = Performer.find(params[:performer_id])
  selected_track = params[:selected_track]
  if FileTest.exists?(File.expand_path(@performer.photo))
    @performance.photo = File.open(File.expand_path(@performer.photo))
  end

  @performance.audio = File.open(File.expand_path(@performer.send(selected_track)))

  if @performance.save
    flash[:notice] = 'Performer scheduled.'
    redirect_to :controller => :performer, :action => :index
  else
    render :action => 'schedule'
  end
end
表演者模型

class Performer/\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z]{2,})\z/i
验证确认:电子邮件
验证是否存在:音频一、:音频二、:音频三、:照片、:如果=>:已提交
创建后:salt\u访问\u键
序列化:可用性
序列化:阶段
属性访问器:其他类型的音乐
保存前:设置其他类型
def set_其他_类型
如果音乐类型=其他
self.type_of_music=“Other-#{Other_type_of_music}”除非Other_type_of_music.blank?
结束
结束
def salt_进入_钥匙
更新属性(:access_key,Digest::SHA1.hexdigest(-->{self.id}--{self.name}--{self.festival.year})))
结束
def优先级
阶段=[]
festival=festival.find(self.festival\u id.to\u i)
self.stages.collect{|键,值|
id=key.gsub(/[\D]/,'')。到
如果id>0

stagessend
方法相当于调用对象上的给定方法。因此,如果
selected\u track
变量的值为1234,则
@performer.send(selected\u track)
@performer.1234
相同。或者,如果
selected\u track
为“a\u whiter\u shade\u pale”然后,这就像呼叫
@performer.a\u-whiter\u-shade\u-pale


那么,执行者类可能会覆盖
方法\u missing
,这样您就可以用任何曲目(名称或ID,上面不清楚)调用它,并将其解释为在该执行者的曲目中搜索该曲目。

发送
用于传递方法(和参数)当你事先不知道方法的名称时,它非常方便,因为它只表示为一个字符串或符号

例如:
Performer.find(参数[:Performer\u id])
Performer.send(:find,参数[:Performer\u id])相同。


这里要小心,因为在使用
send
时依赖params可能是危险的:如果用户通过
destroy
delete
,它实际上会删除您的对象。

send方法的Ruby实现用于向对象发送方法消息,其工作原理如下:

class Car

  def start
    puts "vroom"
  end

  private

  def engine_temp
    puts "Just Right"
  end

end

@car = Car.new
@car.start # output: vroom
@car.send(:start) # output: vroom
这是最基本的,另外一条重要信息是send允许您将消息发送到私有方法,而不仅仅是公共方法

@car.engine_temp  # This doesn't work, it will raise an exception
@car.send(:engine_temp)  # output: Just Right
至于您的特定send调用将执行什么操作,在
Performer
类中很可能缺少
def方法,该类被设置为捕获该方法并执行某些操作


希望这有帮助,祝你好运!

谢谢你的快速响应,JacobM!你的回答真的很有帮助。我想让我有点困惑的是,Performer类没有定义一个方法来调用你所描述的方法。你的@Performer.1234示例是否表示由于发送用法还是什么?我注意到Performer类中也使用了before\u过滤器。啊,您发布的代码澄清了一些事情。所讨论的
方法\u缺少
是在ActiveRecord::Base中——ActiveRecord的工作方式是我可以定义一个列(在数据库中),然后调用它,即使它不是模型中定义的方法。
method\u missing
捕获该方法调用,ActiveRecord匹配“method”我用列/属性名进行了调用。现在一切都开始变得更有意义了。我来自编程的老派。PHP和Perl,现在才开始关注对象驱动的严格ORM开发结构。感谢您的洞察力。非常感谢。:)让我澄清一下,当我说“老派”时我只是用它来描述那些语言松散的编码原则。从80年代末开始编程:)“send方法相当于在对象上调用给定的方法。”这绝对是最好的答案。谢谢你的引导!我明白了。这其中一些现在开始变得更有意义了。也许这部分解释了页面抛出的一个错误,因为据我所知,'selected_track'变量从未传递给do_schedule方法。谢谢ctcherry!很好的示例!至于方法\u缺少引用您刚刚创建了。不,实际上执行者类中只有4个方法。3(索引、显示和销毁)还有一个私人查找。这是否意味着发送无法正常工作?发送仍将工作。它触发的内容取决于传递给它的
选定的\u track
变量。您可以将其记录并显示给我们,我们可能会给您提供更多信息。另外,您是否正在查看Performer model或controller?您想查看此发送呼叫问题的模型代码。@Skittles不太可能
索引
显示
、和
销毁
方法都在
执行者
类中,这几乎可以肯定是一个给定您问题中的代码的模型。
执行者
模型是否有
>选择了_track
方法还是DB列?@Dave Newton,我在控制器中查找。我可以为你们粘贴模型,如果这能让事情变得清晰一点的话。看起来
@car.engine_temp  # This doesn't work, it will raise an exception
@car.send(:engine_temp)  # output: Just Right