1

我对 Rails 还很陌生,我对如何在 if...else 语句之外传递局部变量感到困惑。看起来在帮助文件中创建一个方法是执行此操作的常规方法,但我不确定如何执行此操作。

所以我想找到任务的作者。如果任务的作者不存在,我想使用其父教学大纲的作者(任务属于教学大纲)。然后我想打印出那个作者的用户名。当我只处理一个任务时,我能够做到这一点,比如:

//controller
@mission = Mission.first
if !@mission.author.blank?
  @author = @mission.author
else
  @author = @mission.syllabus.author
end

//view
<%= @author.username %> 

但是在处理 foreach 循环时我不确定如何执行此操作:

//controller
@mission = Mission.all

//view 
<% @mission.each do |mission| %>
..(where do I put the logic of finding author? I can't put it in my controller anymore and it won't pass the @author variable outside the if else statement if I put the logic here in the view)..
<%= @author.username %>
<% end %>

我徒劳的尝试是创建一个助手:

def author_getter(mission_id)
  @mission = Mission.find(params[:mission_id])
  if !@mission.author.blank? 
    @author = @mission.author 
    return @author
  else
    @author = @mission.syllabus.author  
    return @author
  end 
end

并将以下内容放入循环中

<%= author_getter(mission) %>

然而,这并没有奏效。在 if...else 语句之外传递变量的最佳方法是什么?

4

2 回答 2

3

您的辅助方法有点混乱。助手不应该在 中四处寻找params,他们应该只是用他们被调用的参数来做事。您正在传递 a但不使用它,当参数名称指示而不是请求 ID 时mission_id,您还使用(显然)一个对象调用它。mission此外,您不需要在助手中处理实例变量,只需简单的旧变量即可。

调整界面以请求任务对象,然后使用该对象:

def author_of(mission)
  mission.author.present?? mission.author : mission.syllabus.author
end

或者,既然mission.author应该存在nil或存在,您可以利用以下错误nil

def author_of(mission)
  mission.author || mission.syllabus.author
end

然后在你的 ERB 中:

<!-- Note that you should use the plural @missions for a collection, you'll have to fix your controller as well. -->
<% @missions.each do |mission| %>
    <%= author_of(mission).username %>
<% end %>

当然,一旦我们简化并更正了您的助手,您可能会认为它太小而不值得打扰;如果是这样,那么您可以放弃助手并在 ERB 中完成所有操作:

<% @mission.each do |mission| %>
    <%= (mission.author || mission.syllabus.author).username %>
<% end %>

但是,我认为您在错误的地方有这个逻辑:这应该在 Mission 本身内部,以便所有东西(其他模型、JSON 构建器......)都可以利用它。所以,这样的方法是有意义的:

class Mission
  def real_author
    author || syllabus.author
  end
end

那么你可以在你的 ERB 中这样说:

<% @missions.each do |mission| %>
    <%= mission.real_author.username %>
<% end %>
于 2012-05-11T01:01:17.407 回答
0

除非我误解了您的问题,否则您可以在循环中执行此操作而无需使用 find。

//view 
<% @mission.each do |mission| %>
   <%= mission.author.username %>
<% end %>

请记住,您正在遍历所有任务对象。一旦你有了一个任务对象,你就可以像往常一样访问作者。

于 2012-05-11T00:47:42.603 回答