我在主席控制器中的show
动作根据Chair
的名称创建了首字母缩写词。以下代码有效:
def show
@chair = Chair.find(params[:id])
@user = @chair.user
first_letters = []
@chair.name.split.each do |word|
first_letters << word[0]
end
@names = first_letters.join
end
我想提取一个acronym
方法,该方法负责创建首字母缩写词。我尝试过:
def show
@chair = Chair.find(params[:id])
@user = @chair.user
@names = @chair.acronym
end
def acronym
first_letters = []
@chair.name.split.each do |word|
first_letters << word[0]
end
first_letters.join
end
但是,无法从acronym
访问show
。方法名称和视图需要匹配,但是有没有办法像这样使用单独的方法acronym
?
答案 0 :(得分:4)
为了使@chair.acronym
工作,您需要在acronym
模型上定义Chair
方法。
或者,您也可以像这样重构,将acronym
方法保留在您的控制器中:
def acronym(chair)
first_letters = []
chair.name.split.each do |word|
first_letters << word[0]
end
first_letters.join
end
您将这样调用此方法:
@names = acronym(@chair)
您还有其他选择(装饰器/演示器),不在此问题范围内(但如果您对设计/应用程序结构感兴趣,可能值得调查)
如果将其移至chair.rb
中的Chair模型中,则可以将其编写为:
def acronym
first_letters = []
name.split.each do |word|
first_letters << word[0]
end
first_letters.join
# Alternative, one line
# name.split.map(&:chars).map(&:first).join('')
end
然后,您可以在控制器中致电@chair.acronym
答案 1 :(得分:1)
Rails方法应该将业务逻辑放入模型文件中。
我们应该将acronym
方法逻辑放入模型文件中,并将其定义为实例方法。
然后使用acronym
对象以如下方式从控制器调用@chair
方法:
@chair.acronym
希望有帮助...
答案 2 :(得分:-1)
如果您想在控制器上将首字母缩写词设置为新操作,则需要更新config/routes.rb
。最简单的方法是添加一条静态路由:
get 'my_controller_name/acronym'
您还需要一个相应的视图才能在app/views/my_controller/acronym.erb
中呈现结果
如果您只是想在不实现视图的情况下进行游戏,则可以仅使用render text而不使用模板(视图)。只需将其添加到您的acronym
操作的结尾即可:
render plain: first_letters.join
您想知道的一切都在rails guide on routing中。