单击#new & #edit 时如何停止NoMethodError?
How to stop NoMethodError when clicking #new & #edit?
我很难弄清楚如何将多个控制器的逻辑合并到侧边栏中。
例如,我想在边栏中有一个部分使用 habits_controller 中的 @habits
逻辑和一个使用 goals_controller 中的 @unaccomplished_goals
逻辑的部分.
对于这个问题,我们只关注 @unaccomplished_goals
。
<% @top_3_goals.each do |goal| %>
在应用程序的侧边栏中正确显示,它来自 goals_controller #index @top_3_goals = @unaccomplished_goals.top_3
BUT 如果我点击链接goals/new or goals/1/edit 我感到害怕:undefined method each for nil:NilClass
!
这是一个视图细分:
我在views/layouts/application.html.erb
中使用<%= render 'sidebar/sidebar' %>
抢 views/sidebar/_sidebar.html.erb
以便使用 <%= render 'goals/upcoming' %>
抢 views/goals/_upcoming.html.erb
views/goals/_upcoming.html.erb
<table>
<% @top_3_goals.each do |goal| %>
<tr>
<td>
<strong>
<%= link_to goal.name, edit_goal_path(goal) %>
</strong>
</td>
<td>
<%= goal.deadline.strftime("%m-%d-%Y") %>
</td>
</tr>
<% end %>
</table>
views/sidebar/_sidebar.html.erb
<div id="sidebarsection" class="panel panel-default">
<div id="sidebarheading" class="panel-heading"><h5><b>Upcoming</b></h5></div>
<%= render 'goals/upcoming' %>
</div>
目标控制器
def index
if params[:tag]
@goals = Goal.tagged_with(params[:tag])
else
@goals = Goal.all.order("deadline")
@accomplished_goals = current_user.goals.accomplished
@unaccomplished_goals = current_user.goals.unaccomplished
@top_3_goals = @unaccomplished_goals.top_3
end
end
目标模型
class Goal < ActiveRecord::Base
belongs_to :user
acts_as_taggable
scope :accomplished, -> { where(accomplished: true) }
scope :unaccomplished, -> { where(accomplished: false) }
validates :name, presence: true
scope :top_3, -> do
order("deadline DESC").
limit(3)
end
end
我需要在 sidebar_controller 中添加任何内容吗?我试着在那里添加逻辑,但它似乎没有任何区别。我还是个初学者,所以我在这里说的可能毫无意义。现在我在 sidebar_controller 中什么都没有,因为我从那里得到的唯一视图是 _sidebar.html.erb
(我不太确定 partials 如何利用控制器)。如果我在目标索引中呈现部分 _upcoming.html.erb
效果很好(所有链接都有效),但是如果我在 _sidebar 中呈现它怎么让它工作?
谢谢你能容忍我这么远=]
不应该有侧边栏控制器这样的东西,除非你打算让侧边栏成为某种 iframe 或其他东西(这很奇怪)。
就像@patrickmcgraw 建议的那样,我会在应用程序控制器中创建一个 before_action 以确保始终设置这些变量。
class ApplicationController < ActionController::Base
before_action :set_top_3_goals
def set_top_3_goals
@top_3_goals = current_user.goals.unaccomplished.top_3
end
end
我很难弄清楚如何将多个控制器的逻辑合并到侧边栏中。
例如,我想在边栏中有一个部分使用 habits_controller 中的 @habits
逻辑和一个使用 goals_controller 中的 @unaccomplished_goals
逻辑的部分.
对于这个问题,我们只关注 @unaccomplished_goals
。
<% @top_3_goals.each do |goal| %>
在应用程序的侧边栏中正确显示,它来自 goals_controller #index @top_3_goals = @unaccomplished_goals.top_3
BUT 如果我点击链接goals/new or goals/1/edit 我感到害怕:undefined method each for nil:NilClass
!
这是一个视图细分:
我在views/layouts/application.html.erb
中使用<%= render 'sidebar/sidebar' %>
抢 views/sidebar/_sidebar.html.erb
以便使用 <%= render 'goals/upcoming' %>
抢 views/goals/_upcoming.html.erb
views/goals/_upcoming.html.erb
<table>
<% @top_3_goals.each do |goal| %>
<tr>
<td>
<strong>
<%= link_to goal.name, edit_goal_path(goal) %>
</strong>
</td>
<td>
<%= goal.deadline.strftime("%m-%d-%Y") %>
</td>
</tr>
<% end %>
</table>
views/sidebar/_sidebar.html.erb
<div id="sidebarsection" class="panel panel-default">
<div id="sidebarheading" class="panel-heading"><h5><b>Upcoming</b></h5></div>
<%= render 'goals/upcoming' %>
</div>
目标控制器
def index
if params[:tag]
@goals = Goal.tagged_with(params[:tag])
else
@goals = Goal.all.order("deadline")
@accomplished_goals = current_user.goals.accomplished
@unaccomplished_goals = current_user.goals.unaccomplished
@top_3_goals = @unaccomplished_goals.top_3
end
end
目标模型
class Goal < ActiveRecord::Base
belongs_to :user
acts_as_taggable
scope :accomplished, -> { where(accomplished: true) }
scope :unaccomplished, -> { where(accomplished: false) }
validates :name, presence: true
scope :top_3, -> do
order("deadline DESC").
limit(3)
end
end
我需要在 sidebar_controller 中添加任何内容吗?我试着在那里添加逻辑,但它似乎没有任何区别。我还是个初学者,所以我在这里说的可能毫无意义。现在我在 sidebar_controller 中什么都没有,因为我从那里得到的唯一视图是 _sidebar.html.erb
(我不太确定 partials 如何利用控制器)。如果我在目标索引中呈现部分 _upcoming.html.erb
效果很好(所有链接都有效),但是如果我在 _sidebar 中呈现它怎么让它工作?
谢谢你能容忍我这么远=]
不应该有侧边栏控制器这样的东西,除非你打算让侧边栏成为某种 iframe 或其他东西(这很奇怪)。
就像@patrickmcgraw 建议的那样,我会在应用程序控制器中创建一个 before_action 以确保始终设置这些变量。
class ApplicationController < ActionController::Base
before_action :set_top_3_goals
def set_top_3_goals
@top_3_goals = current_user.goals.unaccomplished.top_3
end
end