2014-09-19 57 views
0

我是Rails的新手,希望实现以下目标。在Rails 4中为视图文件定义一种新方法

在我看来,我有一个非常详细的组表达式

<% @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中做到这一点?

回答

2

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

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

这应该让你做你想做的。

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) %> 
+0

谢谢。这也有帮助! – 2014-09-19 22:36:53

1

对象

你要记住,Rails是object orientated

这意味着,如果哟我正在寻找使用方法,你必须欣赏他们关系到你希望他们的工作对象。这里要注意的重要一点是,因此不存在你可以创建你想要的功能有两种方式:

  1. 创建一个“助手”方法
  2. 创建“实例”方法

我会为你在这里解释两者:


Helper

"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基本上都是一个“对象”。这意味着,如果你愿意,你可以介绍一个实例方法为对象的每个实例

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

相关问题