我是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中做到这一点?
答案 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
这意味着,如果您希望使用方法,则必须了解他们与您希望他们合作的对象的关系。这里需要注意的重要一点是,有两种方法可以创建您想要的功能:
- 创建&#34;助手&#34;方法
- 创建&#34;实例&#34;方法
醇>
我将在这里为您解释:
<强>辅助强>
"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;。这意味着如果您愿意,可以为该对象的每个实例引入一个实例方法:
#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