【问题标题】:How to add an additional View to generated Scaffold and adding an action to it如何向生成的 Scaffold 添加额外的 View 并向其添加操作
【发布时间】:2015-11-22 02:12:33
【问题描述】:

大家好,我正在 Rails 4 Ruby 2 中构建 CAD 应用程序

如果这是一个菜鸟问题,我很抱歉,但我在这里挂了..

背景

我有我的主索引页面,充当多视图调度窗口,目前它显示活动的挂起和清除的呼叫。我现在要添加的是一个二级页面,用于列出状态为活动的呼叫,并且我最终可以添加一些搜索字段来查找以前的呼叫。

我当前的 calls_controller.rb 索引如下所示:

class CallsController < ApplicationController
  before_action :set_call, only: [:show, :edit, :update, :destroy]

  # GET /calls
  # GET /calls.json
  def index
    @calls = Call.all
    @active_calls = @calls.select{|x| x.status == 'ACTIVE'}
    @pending_calls = @calls.select{|x| x.status == 'PENDING'}
    @clear_calls = @calls.select{|x| x.status == 'CLEAR'}
    @approved_calls = @calls.select{|x| x.status == "APPROVED"}
  end

**I HAVE THEN ADDED**

  def histroy
    @calls = Call.all
    @approved_calls = @calls.select{|x| x.status == "APPROVED"}
  end

我在脚手架视图中添加了一个视图,并将该视图命名为 history.hmtl.erb,如下所示

我的 routes.rb 看起来像

  resources :calls do
    collection do
      get 'history'
    end
  end

然后我创建了访问新视图的按钮:

      <%= link_to history_calls_path, class: "btn btn-primary btn-nav", id: 'home-btn' do %>
        <i class="fa fa-search"> Call History</i>
      <% end %>                     

当我点击按钮访问页面时,出现以下错误:

NoMethodError in Calls#history
undefined method `length' for nil:NilClass --> There are already calls with that status but it should return 0 if there are no approved calls

Extracted source (around line #2):
1
2
3
4
5
6

  <div class="panel panel-warning" id="clr-calls-pnl">
  <div class="panel-heading"><center><h4>Call History -- TOTAL CLEARED CALLS <span class="badge"><%= @approved_calls.length %></span></h4></center></div>
    <table class="table" id="approve-table">
      <thead>
        <tr>
          <th><center>Call Number</center></th>

这里的任何帮助将不胜感激,因为我仍然是一个菜鸟,但以前从未做过这种事情。

提前致谢。

编辑#1:

我把它改成了 .try(:lenght)

现在我明白了:

NoMethodError in Calls#history
Showing /Users/TaurenLTD1/Desktop/TaurenLabs/PatrolProCAD/PatProCadApp/app/views/calls/history.html.erb where line #31 raised:
undefined method `each' for nil:NilClass

Extracted source (around line #31):
29
30
31
32
33
34


      <tbody>
        <% @approved_calls.each do |call| %>
        <tr>
          <td><center><%= call.call_number %></center></td>
          <td><center><%= call.site_id %></center></td>

编辑#2:

This is what the rails log is showing when I Open the History Page:

Started GET "/calls/history" for ::1 at 2015-11-21 19:46:55 -0700
Processing by CallsController#history as HTML
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 3]]
  Rendered calls/history.html.erb within layouts/application (3.7ms)
Completed 200 OK in 131ms (Views: 129.9ms | ActiveRecord: 0.3ms)

【问题讨论】:

  • 见问题底部的编辑#1。它几乎就像它不与模型交谈。如果你愿意,我可以添加整个控制器?
  • 这一切都适用于 index.html.erb 页面。
  • 再一次,您的@approved_callsnil,这就是问题所在。你能检查一下为什么它没有填充到控制器动作中吗?此外,为防止出现此错误,您可以添加这样的条件:&lt;% if @approved_calls.present?%&gt; 然后循环它们,如果没有,则显示一条消息,表明没有批准的调用显示。
  • 另外,在你的控制器中试试这个:@approved_calls = @calls.select{|x| x.status == "APPROVED"} || [] 这将确保你的@approved_calls 不会是nil,如果它找不到任何东西,它应该是一个空数组.试试这个,让我知道。
  • 好的,所以我将 if approved_calls.present 添加到页面.. 但是它仍然没有找到状态为已批准的呼叫,已经有一个具有该状态的呼叫。 @approved_calls = @calls.select{|x| x.status == "APPROVED"} 已经在 def 历史记录下的控制器中,如上面的原始帖子所示。但是我现在至少可以看到页面了

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

您可以在此处使用try

变化:

<%= @approved_calls.length %>

收件人:

<%= @approved_calls.try(:length) %>

由于某种原因,您的 @approved_callsnil,这就是您收到该错误的原因。以上应该可以防止您收到该错误。但是,更好的方法是查看为什么@approved_calls 获得nil 值并修复该部分并确保填充@approved_calls 实例变量。

更新

将您的 history 操作更改为:

  def history
    @approved_calls = Call.where(status: 'APPROVED')
  end

最终更新

实际上,您的控制器操作中有错字。将histroy 更改为history

【讨论】:

  • 好的,所以我将 if approved_calls.present 添加到页面.. 但是它仍然没有找到状态为已批准的呼叫,已经有一个具有该状态的呼叫。 @approved_calls = @calls.select{|x| x.status == "APPROVED"} 已经在 def history 下的控制器中,如上面的原始帖子所示。但是我现在至少可以看到页面了
  • 你必须确保你的数据库中有status: 'APPROVED'的调用,那么它肯定可以工作。尝试从您的 Rails 控制台使用 status: 'APPROVED':Call.create(status: 'APPROVED') 创建调用,然后重试。
  • 所以我跟随它在控制台中创建它并且它创建了..但仍然没有出现在视图中
  • 如果你在 Rails 控制台中执行Call.where(status: 'APPROVED'),你会看到什么?
  • 然后就解决了!哇,我觉得这里是一个完整的工具!非常感谢您在这里的帮助!我真的很感激!
猜你喜欢
  • 2014-12-11
  • 2013-10-25
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2017-06-04
相关资源
最近更新 更多