Ruby on rails 如何在Rails 3中制作自定义助手?
我是Rails的新手,我对如何在if…else语句之外传递局部变量感到困惑。看起来在助手文件中创建方法是实现这一点的常规方法,但我不确定如何做到这一点 所以我想找一个任务的作者。如果任务的作者不存在,我想使用它的父教学大纲的作者(任务属于教学大纲)。然后我想打印出作者的用户名。当我只处理一项任务时,我就能做到这一点,比如:Ruby on rails 如何在Rails 3中制作自定义助手?,ruby-on-rails,ruby,ruby-on-rails-3,variables,methods,Ruby On Rails,Ruby,Ruby On Rails 3,Variables,Methods,我是Rails的新手,我对如何在if…else语句之外传递局部变量感到困惑。看起来在助手文件中创建方法是实现这一点的常规方法,但我不确定如何做到这一点 所以我想找一个任务的作者。如果任务的作者不存在,我想使用它的父教学大纲的作者(任务属于教学大纲)。然后我想打印出作者的用户名。当我只处理一项任务时,我就能做到这一点,比如: //controller @mission = Mission.first if !@mission.author.blank? @author = @mission.a
//controller
@mission = Mission.first
if !@mission.author.blank?
@author = @mission.author
else
@author = @mission.syllabus.author
end
//view
<%= @author.username %>
然后把下面的部分放在循环中
<%= author_getter(mission) %>
然而,这不起作用。在if…else语句之外传递变量的最佳方式是什么?除非我误解了您的问题,否则您可以在循环中执行此操作,而无需使用find
//view
<% @mission.each do |mission| %>
<%= mission.author.username %>
<% end %>
//查看
记住,您正在迭代所有的任务对象。一旦你有了任务对象,你就可以像平常一样访问作者。你的助手方法有点混乱。助手不应该在
params
中闲逛,他们应该只使用调用他们的参数来做事情。您传入了一个mission\u id
,但没有使用它,当参数名称指示需要一个id时,您还使用(显然)一个mission
对象调用它。另外,您不需要在helpers中处理实例变量,只需要简单的旧变量就可以了
调整界面以请求任务对象,然后使用该对象:
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
然后在雇员再培训局:
<!-- 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 %>
<% @missions.each do |mission| %>
<%= mission.real_author.username %>
<% end %>
然后你可以在雇员再培训局说:
<!-- 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 %>
<% @missions.each do |mission| %>
<%= mission.real_author.username %>
<% end %>
问题是,有些任务没有作者,因为它是作为教学大纲的嵌套字段创建的。在这种情况下,它应该是mission.sylletus.username,所以我想要逻辑。这很混乱,但本质上用户可以自己创建任务,或者创建一个教学大纲,其中包含许多嵌套的任务。如果任务是单独创建的,“Mission.author”将起作用,并且是首选,但如果任务是作为教学大纲创建的,则需要使用“Mission.cellus.author”。后来,我这样做,即使它是作为一个教学大纲创建的,它会在作者参数传递给任务作者,但仍然有很多任务没有作者从以前谢谢你!!!现在这很有道理!:):)我真的不知道如何表达我现在的喜悦和感激!!还有一个问题:当我使用'mission.real_author',并且我想将其存储为'@author=mission.real_author',我将在哪里定义@author变量?我必须在.each do循环中执行它,还是我可以在控制器中以某种方式定义它?@KeithRyu:当你已经有了@missions
时,你会想在迭代中使用
,这样,作者就不会泄露出去,也不会在其他地方造成麻烦。我明白了-我想知道,因为我听说你不应该在视图中定义变量。对于模型、控制器和视图中的常规内容,我仍然有点困惑。有人告诉我,我应该在模型中写很多东西,控制器也应该非常精简,但现在我的控制器是最臃肿的-这正常吗?@KeithRyu:当你刚开始工作,不确定自己在做什么时,这很正常。视图用于表示,视图中的变量通常只是其他内容的缩写(如作者
)。控制器将外部世界的数据路由到模型进行处理,然后将结果路由到视图进行表示;它们应该薄而紧。您的大部分逻辑应该以模型方法结束。如果你有一个胖控制器,那么你可能需要几次重构迭代才能将所有东西都放在正确的位置,只有经验(即犯错误)才能教会你如何去做。
class Mission
def real_author
author || syllabus.author
end
end
<% @missions.each do |mission| %>
<%= mission.real_author.username %>
<% end %>