在rails控制器上为ruby中的关联创建变量

时间:2015-12-02 22:16:59

标签: ruby-on-rails-4

我设置了目标 步骤步骤 任务。在我看来,我正在展示一个目标,如果那个目标有步骤,那么我可以拉出那些并展示它们。我现在很难显示每个步骤的任务。我可以获得与正确步骤相关联的任务,因此部分工作正常,但我无法访问任何数据,名称描述专门针对该任务。

我只是不确定如何在控制器中创建它。我在the guide试图寻找解决方案并尝试了类似

之类的东西
 @goal.steps.tasks 
 @step.tasks

我无法找到任何点击在控制器中创建变量的内容,因此我可以访问它。

goals_controller.rb show method

def show
  @goal = Goal.find(params[:id])
  @steps = @goal.steps(page: params[:page])
  # @tasks = ?
end

goal.rb

class Goal < ActiveRecord::Base
  has_many :steps, dependent: :destroy
  has_many :tasks, through: :steps
end

step.rb

class Step < ActiveRecord::Base
  belongs_to :goals
  has_many :tasks, dependent: :destroy
  default_scope -> { order(created_at: :desc) }
 end

task.rb

class Task < ActiveRecord::Base
  belongs_to :steps
end

视图

目标/展示视图

  <p>
    <% if @goal.steps.any? %>

        <!-- Projects Row -->
          <div class="row">
            <%= render @steps %> 
          </div>
        <!-- /.row -->


      <% else %>
      No steps for this goal.
    <% end %>
  </p>

为步骤

渲染的部分内容
<div id="steps-<%= step.id %>" class="col-md-3 portfolio-item not completed" style="background-color:#e26a5c;border-radius:10px;border:1px solid #6cbdc4;margin:0 5px 5px 0;">
    <h3>
        <p>In order to achieve this goal I need to <strong><%= step.name %></strong> in <strong><%= time_ago_in_words(step.deadline) %></strong></p>
    </h3>
    <a href="/steps/<%= step.id %>/edit" style="background: none;"><img src="/img/icon-edit.png"></a>


<% if step.tasks.any? %>

    <%= render "tasks/task" %>

<% else %>

<%end %>
 </div>
 <% else %>

<div id="steps-<%= step.id %>" class="col-md-3 portfolio-item completed" style="background-color:#6cbdc4;border-radius:10px;border:1px solid #e26a5c;margin:0 5px 5px 0;">
    <h3>
        <p>In an effort to achieve this goal I needed to <strong><%= step.name %></strong> in <strong><%= time_ago_in_words(step.deadline) %></strong></p>
    </h3>
    <a href="/steps/<%= step.id %>/edit" style="background: none;"><img src="/img/icon-edit.png"></a>
</div>

任务/任务是我试图引入的部分内容,我可以在正确的步骤和所有内容上链接到它,但是当我输入 task.name 时它会显示未定义的方法task.description in。

1 个答案:

答案 0 :(得分:1)

goals_controller.rb

中试试这个
def show
  @goal = Goal.find(params[:id])
  @steps = @goal.steps(page: params[:page]).includes(:tasks)
end

然后在你看来你可以有这样的东西:

<ul>
  <% @steps.each do |step| %>
    <li>
      <%= step %>
      <p>Tasks:</p>
      <ul>
        <% step.tasks.each do |task| %>
          <li><%= task %></li>
        <% end %>
      </ul>
    </li>
  <% end %>
</ul>

有关includes的更多信息:http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations