在一个页面上创建Rails todo列出具有目标和任务的应用程序 - 缺少参数

时间:2014-12-31 17:00:14

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我是Rails的初学者,现在已经阅读了教程并输入了几个月的应用程序。在前端世界度过了几年之后,我真的很享受它,并开始快速适应这一切。现在是时候让我开始构建我自己的东西而不需要任何手握。到目前为止,非常好。

我正在创建一个基本的待办事项列表应用,其目标和任务显示在相同页面 - goals #index上。我的问题是,我不确定如何为特定目标(属于用户)获取所有任务。我知道我需要将ID参数传递给目标模型才能找到它的任务,如下所示:

Goal.find(1).tasks

以上工作正常,因为我已经在任务表上设置了外键,并且具有目标模型的has_many:tasks关系和Task模型的belongs_to关系。

这是我的目标控制者:

  def index
  @user = current_user

  @goals = @user.goals # list all goals for the current user and assign it to the @goals variable.

  # Need to find all tasks for each goal ID and assign it to the @tasks variable. Goal ID needs to      be supplied here, but it isn't as we're not in show action.
  @tasks = Goal.find(1).tasks

正如我所说,当我手动输入ID(本例中为1)时,我可以找到目标的所有任务。这在我的应用程序中工作正常,没有错误。但显然我想动态提供这些ID,而我只是不确定如何在那里获得参数。

我试过以下内容:

@tasks = Goal.find(params[:id]).tasks

@tasks = Goal.find(params[:goal_id]).tasks

我得到了#34;无法找到没有ID的目标"我尝试在视图中迭代@tasks时出错。这是有道理的,因为我不认为目标参数被传递给它,因为我们不在Show行动中。

当然必须有一个简单的Rails方式?!我很难过,也不知道该往哪里看。感谢您的帮助和新年快乐。

3 个答案:

答案 0 :(得分:3)

您正在获得当前用户的目标,因此当您执行此操作时,您将拥有一个数组对象。所以当你将数组对象传递给find时,它将有多个IDS。因此,当需要从所有目标中找到所有任务时,您只需要传递IDS数组而不是单个值。

@tasks = Task.where(:goal_id => @goals)

这将运行此SQL查询。

  

SELECT“tasks”。* FROM“tasks”WHERE“tasks”。“goal_id”IN(SELECT   “目标”。“id”来自“目标”)

所以当你处理数组时只需传递id。例如[1,2,3]

答案 1 :(得分:2)

一旦你@goals = @user.goals(假设它正常工作,它听起来像是这样),你就有了自己的目标,没有理由回到数据库去找"找到&#34 34;它们。

要从用户的所有目标中获取所有任务,您可以执行以下操作:

@tasks = []
@goals.each do |goal|
  @tasks << goal.tasks
end

答案 2 :(得分:0)

当然啊,@ goals是用户目标的一个数组,所以我可以使用它。当有人告诉你时,这么简单。感谢你的帮助!

这是我的最终代码(我保持控制器不变)。这将获得数组中的第一个目标,然后获取与每个目标相关联的任务。我有一定数量的目标,所以我可以为每个目标使用目标[0],目标[1]或目标[2]。

<% @goals[0].tasks.each do |task| %>
  <li><div class="task-item"><%= task.task_name %></div></li>
<% end %>