在Rails 4中为视图文件定义一个新方法

时间:2014-09-19 21:49:50

标签: ruby-on-rails ruby ruby-on-rails-4

我是Rails的新手,希望实现以下目标。

在我看来,我有一套非常冗长的表达式

<% @courses.each do |course| %>
  <%= course.name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '')` %>
<% end %>

我想定义一个名为get_file_name的新方法,并将原始代码的第二行替换为:

<%= course.get_file_name %>

现在,我尝试在app/helpers/application_helper.rb中定义新方法,但它没有用。

此外,在app/models/course.rb中放置范围并不成功。我试着写scope :course_image, -> { name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '') }

在php中,我只想定义一个新函数。我怎么能在Rails 4中做到这一点?

3 个答案:

答案 0 :(得分:2)

由于您想要在课程实例上调用该方法,您应该在该类上定义一个实例方法。

class Course
  def get_file_name
    name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '')
  end
end

这应该可以让你做你想做的事。

答案 1 :(得分:2)

如果要在课程实例上调用方法,请查看ptd's的答案。如果你真的很兴奋使用辅助方法,你需要将对象作为参数传递给辅助方法:

module ApplicationHelper
  def get_file_name(course)
    course.name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '')
  end
end

然后在你看来你会写:

<%= get_file_name(course) %>

答案 2 :(得分:1)

<强>物件

你必须记住Rails是object orientated

这意味着,如果您希望使用方法,则必须了解他们与您希望他们合作的对象的关系。这里需要注意的重要一点是,有两种方法可以创建您想要的功能:

  
      
  1. 创建&#34;助手&#34;方法
  2.   
  3. 创建&#34;实例&#34;方法
  4.   

我将在这里为您解释:


<强>辅助

"Helper" methods与PHP函数几乎相同,因为它们不明确。

他们住在#app/helpers/[x]_helper.rb,看起来像这样:

#app/helpers/application_helper.rb
class ApplicationHelper
   def my_method
      ...
   end
end

这里要注意的重要一点是,当你的objects中的帮助者分离时,你必须发送你想要操纵的数据。这非常重要,因为正如您在一分钟内看到的那样,这意味着您可以使用它们来处理各种不同的数据集

以下是您在案例中如何使用帮助方法:

#View
<%= get_file_name course.name %>

#app/helpers/application_helper.rb
class ApplicationHelper
  def get_file_name name
      name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '')
  end
end

实例方法

下一步是查看为Course模型本身创建实例方法

因为Rails(由于构建在Ruby上)是面向对象的,所以你创建的每个Model基本上都是一个&#34;对象&#34;。这意味着如果您愿意,可以为该对象的每个实例引入一个实例方法:

enter image description here

#app/models/course.rb
class Course < ActiveRecord::Base
   def get_file_name
      name.squish.downcase.tr(" ","_").gsub(/[^0-9a-z_]/i, '')
   end
end

这样您就可以致电:@course.get_file_name