在“显示” /“索引”页面中使用其他方法

时间:2018-12-04 02:12:55

标签: ruby-on-rails

我在主席控制器中的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

3 个答案:

答案 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中。