Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails 3中制作自定义助手?_Ruby On Rails_Ruby_Ruby On Rails 3_Variables_Methods - Fatal编程技术网

Ruby on rails 如何在Rails 3中制作自定义助手?

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

我是Rails的新手,我对如何在if…else语句之外传递局部变量感到困惑。看起来在助手文件中创建方法是实现这一点的常规方法,但我不确定如何做到这一点

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

//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 %>