索引中的NoMethodError:如何定义嵌套属性? [英] NoMethodError in Index: How to Define the Nested Attributes?
问题描述
Quantifieds#index中的NoMethodError
#Quantified:0x007ff3fe7d6c08的未定义方法"date_value"
如何定义date_value& result_value是否可以在量化索引中使用?
<!-- Default bootstrap panel contents -->
<div id="values" class="panel panel-default">
<div class="panel-heading"><h4><b>AVERAGE</b></h4></div>
<!-- Table -->
<table>
<% @averaged_quantifieds.each do |averaged| %>
<% if averaged.user == current_user %>
<th class="value">
<%= link_to edit_quantified_path(averaged) do %>
<%= averaged.name %>
<% end %>
(<%= averaged.metric %>)
</th>
<tbody class="value">
<td><%= averaged.date_value.strftime("%m-%Y") %></td>
<td><%= averaged.result_value %></td>
</tbody>
<% end %>
<% end %>
</table>
</div>
<br>
<br>
<br>
<br>
<!-- Default bootstrap panel contents -->
<div id="values" class="panel panel-default">
<div class="panel-heading"><h4><b>INSTANCE</b></h4></div>
<!-- Table -->
<table>
<% @instance_quantifieds.each do |instance| %>
<% if instance.user == current_user %>
<th class="value">
<%= link_to edit_quantified_path(instance) do %>
<%= instance.name %>
<% end %>
(<%= instance.metric %>)
</th>
<tbody class="value">
<td><%= instance.date_value.strftime("%m-%Y") %></td>
<td><%= instance.result_value %></td>
</tbody>
<% end %>
<% end %>
</table>
</div>
<div class="values-button">
<%= link_to new_quantified_path, class: 'btn' do %>
<b><span class="glyphicon glyphicon-plus"</span></b>
<% end %>
</div>
date_value& result_value源自_form中的f.simple_fields_for:results.我正在用茧来创建我的嵌套属性.
= simple_form_for @quantified do |f|
.america
%form
= f.select :categories, Quantified::CATEGORIES
%br/
%br/
.form-group
= f.text_field :name, class: 'form-control', placeholder: 'Enter Name'
.form-group
= f.text_field :metric, class: 'form-control', placeholder: 'Enter Metric'
#results
= f.simple_fields_for :results do |result|
= render 'result_fields', :f => result
= link_to_add_association 'Add Result', f, :results
%br/
= button_tag(type: 'f.submit', class: "btn") do
%span.glyphicon.glyphicon-plus
.nested-fields
.form-group
= f.text_field :result_value, class: 'form-control', placeholder: 'Enter Result'
%br
= f.date_select :date_value, :order => [:month, :year], class: 'date-select'
= link_to_remove_association "Remove Result", f
我认为解决方案可能是在更改控制器时找到的:
class QuantifiedsController < ApplicationController
before_action :set_quantified, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
def index
@quantified = Result.all.order("date_value")
@averaged_quantifieds = current_user.quantifieds.averaged
@instance_quantifieds = current_user.quantifieds.instance
end
def show
end
def new
@quantified = current_user.quantifieds.build
@quantified.results.build
end
def edit
end
def create
@quantified = current_user.quantifieds.build(quantified_params)
if @quantified.save
redirect_to quantifieds_url, notice: 'Quantified was successfully created'
else
render action: 'new'
end
end
def update
if @quantified.update(quantified_params)
redirect_to quantifieds_url, notice: 'Goal was successfully updated'
else
render action: 'edit'
end
end
def destroy
@quantified.destroy
redirect_to quantifieds_url
end
private
def set_quantified
@quantified = Quantified.find(params[:id])
end
def correct_user
@quantified = current_user.quantifieds.find_by(id: params[:id])
redirect_to quantifieds_path, notice: "Not authorized to edit this goal" if @quantified.nil?
end
def quantified_params
params.require(:quantified).permit(:categories, :name, :metric, :result, :date, results_attributes: [:id, :result_value, :date_value, :_destroy])
end
end
这里有更多代码可提供更多上下文:
routes.rb
Rails.application.routes.draw do
resources :goals
resources :values
resources :quantifieds do
resources :results
end
devise_for :users
root 'values#index'
get "about" => "pages#about"
schema.rb
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150123210404) do
create_table "goals", force: true do |t|
t.string "name"
t.date "deadline"
t.boolean "accomplished", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "goals", ["deadline"], name: "index_goals_on_deadline"
add_index "goals", ["user_id"], name: "index_goals_on_user_id"
create_table "quantifieds", force: true do |t|
t.string "categories"
t.string "name"
t.string "metric"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "quantifieds", ["categories"], name: "index_quantifieds_on_categories"
add_index "quantifieds", ["user_id"], name: "index_quantifieds_on_user_id"
create_table "results", force: true do |t|
t.string "result_value"
t.date "date_value"
t.integer "quantified_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "results", ["quantified_id"], name: "index_results_on_quantified_id"
add_index "results", ["user_id"], name: "index_results_on_user_id"
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
create_table "values", force: true do |t|
t.string "name"
t.string "categories"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "values", ["categories"], name: "index_values_on_categories"
add_index "values", ["user_id"], name: "index_values_on_user_id"
end
_create_results.rb
class CreateResults < ActiveRecord::Migration
def change
create_table :results do |t|
t.string :result_value
t.date :date_value
t.belongs_to :quantified, index: true
t.timestamps null: false
end
add_foreign_key :results, :quantifieds
end
end
_add_user_id_to_results.rb
class AddUserIdToResults < ActiveRecord::Migration
def change
add_column :results, :user_id, :integer
add_index :results, :user_id
end
end
quantified.rb
class Quantified < ActiveRecord::Base
belongs_to :user
scope :averaged, -> { where(categories: 'averaged') }
scope :instance, -> { where(categories: 'instance') }
has_many :results
accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true
CATEGORIES = ['averaged', 'instance']
end
result.rb
class Result < ActiveRecord::Base
belongs_to :user
belongs_to :quantified
end
完整跟踪
activemodel (4.2.0.rc3) lib/active_model/attribute_methods.rb:433:in `method_missing'
app/views/quantifieds/index.html.erb:18:in `block in _app_views_quantifieds_index_html_erb__3407997734302574408_70263238235460'
activerecord (4.2.0.rc3) lib/active_record/relation/delegation.rb:46:in `each'
activerecord (4.2.0.rc3) lib/active_record/relation/delegation.rb:46:in `each'
app/views/quantifieds/index.html.erb:9:in `_app_views_quantifieds_index_html_erb__3407997734302574408_70263238235460'
actionview (4.2.0.rc3) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.0.rc3) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.0.rc3) lib/action_view/template.rb:143:in `render'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.0.rc3) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:52:in `render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:14:in `render'
actionview (4.2.0.rc3) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/renderer.rb:23:in `render'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:100:in `_render_template'
actionpack (4.2.0.rc3) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:32:in `render_to_body'
actionpack (4.2.0.rc3) lib/action_controller/metal/renderers.rb:37:in `render_to_body'
actionpack (4.2.0.rc3) lib/abstract_controller/rendering.rb:25:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:16:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render'
activesupport (4.2.0.rc3) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/benchmark.rb:294:in `realtime'
activesupport (4.2.0.rc3) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:41:in `block in render'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:84:in `cleanup_view_runtime'
activerecord (4.2.0.rc3) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:40:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
actionpack (4.2.0.rc3) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (4.2.0.rc3) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.0.rc3) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:92:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:92:in `_run_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0.rc3) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.0.rc3) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.0.rc3) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.0.rc3) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.2.0.rc3) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.0.rc3) lib/action_controller/metal.rb:236:in `block in action'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:73:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:42:in `serve'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:30:in `each'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:802:in `call'
warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
warden (1.2.3) lib/warden/manager.rb:34:in `catch'
warden (1.2.3) lib/warden/manager.rb:34:in `call'
rack (1.6.0) lib/rack/etag.rb:24:in `call'
rack (1.6.0) lib/rack/conditionalget.rb:25:in `call'
rack (1.6.0) lib/rack/head.rb:13:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.0) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.0) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.0.rc3) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.0.rc3) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
activerecord (4.2.0.rc3) lib/active_record/migration.rb:378:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:88:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:88:in `_run_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.0) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.0) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.0.rc3) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.0) lib/rack/lock.rb:17:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/static.rb:113:in `call'
rack (1.6.0) lib/rack/sendfile.rb:113:in `call'
railties (4.2.0.rc3) lib/rails/engine.rb:518:in `call'
railties (4.2.0.rc3) lib/rails/application.rb:164:in `call'
rack (1.6.0) lib/rack/lock.rb:17:in `call'
rack (1.6.0) lib/rack/content_length.rb:15:in `call'
rack (1.6.0) lib/rack/handler/webrick.rb:89:in `service'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
如果需要更多代码或注释来解决此问题,请告诉我.上帝的速度.
回答您的特定问题:
在索引操作中,您具有:
@quantified = Result.all.order("date_value")
在之前呼叫 .all
是 .order
的原因.
在Rails ActiveRecord中,.all
命令立即触发从数据库中获取项目.
由于存在诸如.where
和.order
之类的数据库IO提取命令来影响从数据库中提取数据的方式(或方式),因此您需要在代码中调用它们,然后触发数据库检索通过.all
:
@quantified = Result.order("date_value").all
为更清楚起见,在此查询中指定升序或降序可能是理想的选择,例如Result.order("date_value ASC").all
,或者如果总是按此顺序使用数据,则使您在Result
模型中订购default_scope
.
调试Undefined Method
"method_name"错误时的一般建议:
在您的问题中,我注意到您没有包括受错误影响的对象的 class 信息,这使得很难正确诊断问题的根源(无论您是否拥有正确的对象) .
提示:诊断错误时,请先检查对象是否存在,然后再调查错误标记的方法.
为什么?因为很多 要正确诊断NoMethodError,必须首先检查 是否正确定义了对象的 要在 不幸的是,这里很容易集中精力处理此错误消息的 NoMethodError in Quantifieds#index undefined method `date_value' for #Quantified:0x007ff3fe7d6c08 How do I define date_value & result_value so it works in the quantifieds index?
date_value & result_value are derived from f.simple_fields_for :results in the _form. I am using cocoon to create my nested attributes.
I think the solution maybe found in altering the controller:
Here's some more code to give more context: routes.rb
schema.rb
_create_results.rb
_add_user_id_to_results.rb
quantified.rb
result.rb
Full trace
Please let me know if you need any more code or comments to bring this question to a resolution. God speed. In your index action you have: Calling In Rails ActiveRecord, the Since database IO fetching commands like For better clarity it may be ideal to specify ascending or descending ordering in this query, e.g. In your question I noticed you didn't include the class information of the object affected by your error, making it hard to diagnose correctly the source of your problem (whether you had the correct object). TIP: When diagnosing an error, check that an object exists FIRST before looking into the method flagged by the error. Why? Because many To properly diagnose a NoMethodError, it's essential to check first that an object's To check an object's class within an Unfortunately its easy here to get focused on the 这篇关于索引中的NoMethodError:如何定义嵌套属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!undefined method "method_name"
错误不是method_name
是undefined
引起的,而是因为对象本身是nil
或不正确的类.>
NoMethodError: undefined method 'method_name'
可能是红色鲱鱼,当您有未加载或实例化的对象时,它会误导您.class
,然后再开始尝试对其进行调试.如果不这样做,很容易陷入困境,以查找 method_name 可能存在的问题,而实际上问题出在您的对象不存在时. undefined method
错误中检查对象的类,只需查找错误的for xxx:Class
部分.说明对象&它的班级.如果您的对象为nil或不存在,则未定义的方法错误将显示 for nil:NilClass
.NoMethodError: undefined method `date_time' for nil:NilClass
date_time
部分,而不是NoMethodError
消息引用了 nil 类.在上面的NoMethodError中,我们的对象为 nil ,其中'date_time'
只是表示代码中的一个点,我们未成功针对nil
对象调用方法.为了正确地解决nil:NilClass对象上的NoMethodError,重要的是调查为什么对象本身未实例化.<!-- Default bootstrap panel contents -->
<div id="values" class="panel panel-default">
<div class="panel-heading"><h4><b>AVERAGE</b></h4></div>
<!-- Table -->
<table>
<% @averaged_quantifieds.each do |averaged| %>
<% if averaged.user == current_user %>
<th class="value">
<%= link_to edit_quantified_path(averaged) do %>
<%= averaged.name %>
<% end %>
(<%= averaged.metric %>)
</th>
<tbody class="value">
<td><%= averaged.date_value.strftime("%m-%Y") %></td>
<td><%= averaged.result_value %></td>
</tbody>
<% end %>
<% end %>
</table>
</div>
<br>
<br>
<br>
<br>
<!-- Default bootstrap panel contents -->
<div id="values" class="panel panel-default">
<div class="panel-heading"><h4><b>INSTANCE</b></h4></div>
<!-- Table -->
<table>
<% @instance_quantifieds.each do |instance| %>
<% if instance.user == current_user %>
<th class="value">
<%= link_to edit_quantified_path(instance) do %>
<%= instance.name %>
<% end %>
(<%= instance.metric %>)
</th>
<tbody class="value">
<td><%= instance.date_value.strftime("%m-%Y") %></td>
<td><%= instance.result_value %></td>
</tbody>
<% end %>
<% end %>
</table>
</div>
<div class="values-button">
<%= link_to new_quantified_path, class: 'btn' do %>
<b><span class="glyphicon glyphicon-plus"</span></b>
<% end %>
</div>
= simple_form_for @quantified do |f|
.america
%form
= f.select :categories, Quantified::CATEGORIES
%br/
%br/
.form-group
= f.text_field :name, class: 'form-control', placeholder: 'Enter Name'
.form-group
= f.text_field :metric, class: 'form-control', placeholder: 'Enter Metric'
#results
= f.simple_fields_for :results do |result|
= render 'result_fields', :f => result
= link_to_add_association 'Add Result', f, :results
%br/
= button_tag(type: 'f.submit', class: "btn") do
%span.glyphicon.glyphicon-plus
.nested-fields
.form-group
= f.text_field :result_value, class: 'form-control', placeholder: 'Enter Result'
%br
= f.date_select :date_value, :order => [:month, :year], class: 'date-select'
= link_to_remove_association "Remove Result", f
class QuantifiedsController < ApplicationController
before_action :set_quantified, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
def index
@quantified = Result.all.order("date_value")
@averaged_quantifieds = current_user.quantifieds.averaged
@instance_quantifieds = current_user.quantifieds.instance
end
def show
end
def new
@quantified = current_user.quantifieds.build
@quantified.results.build
end
def edit
end
def create
@quantified = current_user.quantifieds.build(quantified_params)
if @quantified.save
redirect_to quantifieds_url, notice: 'Quantified was successfully created'
else
render action: 'new'
end
end
def update
if @quantified.update(quantified_params)
redirect_to quantifieds_url, notice: 'Goal was successfully updated'
else
render action: 'edit'
end
end
def destroy
@quantified.destroy
redirect_to quantifieds_url
end
private
def set_quantified
@quantified = Quantified.find(params[:id])
end
def correct_user
@quantified = current_user.quantifieds.find_by(id: params[:id])
redirect_to quantifieds_path, notice: "Not authorized to edit this goal" if @quantified.nil?
end
def quantified_params
params.require(:quantified).permit(:categories, :name, :metric, :result, :date, results_attributes: [:id, :result_value, :date_value, :_destroy])
end
end
Rails.application.routes.draw do
resources :goals
resources :values
resources :quantifieds do
resources :results
end
devise_for :users
root 'values#index'
get "about" => "pages#about"
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150123210404) do
create_table "goals", force: true do |t|
t.string "name"
t.date "deadline"
t.boolean "accomplished", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "goals", ["deadline"], name: "index_goals_on_deadline"
add_index "goals", ["user_id"], name: "index_goals_on_user_id"
create_table "quantifieds", force: true do |t|
t.string "categories"
t.string "name"
t.string "metric"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "quantifieds", ["categories"], name: "index_quantifieds_on_categories"
add_index "quantifieds", ["user_id"], name: "index_quantifieds_on_user_id"
create_table "results", force: true do |t|
t.string "result_value"
t.date "date_value"
t.integer "quantified_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "results", ["quantified_id"], name: "index_results_on_quantified_id"
add_index "results", ["user_id"], name: "index_results_on_user_id"
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
create_table "values", force: true do |t|
t.string "name"
t.string "categories"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "values", ["categories"], name: "index_values_on_categories"
add_index "values", ["user_id"], name: "index_values_on_user_id"
end
class CreateResults < ActiveRecord::Migration
def change
create_table :results do |t|
t.string :result_value
t.date :date_value
t.belongs_to :quantified, index: true
t.timestamps null: false
end
add_foreign_key :results, :quantifieds
end
end
class AddUserIdToResults < ActiveRecord::Migration
def change
add_column :results, :user_id, :integer
add_index :results, :user_id
end
end
class Quantified < ActiveRecord::Base
belongs_to :user
scope :averaged, -> { where(categories: 'averaged') }
scope :instance, -> { where(categories: 'instance') }
has_many :results
accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true
CATEGORIES = ['averaged', 'instance']
end
class Result < ActiveRecord::Base
belongs_to :user
belongs_to :quantified
end
activemodel (4.2.0.rc3) lib/active_model/attribute_methods.rb:433:in `method_missing'
app/views/quantifieds/index.html.erb:18:in `block in _app_views_quantifieds_index_html_erb__3407997734302574408_70263238235460'
activerecord (4.2.0.rc3) lib/active_record/relation/delegation.rb:46:in `each'
activerecord (4.2.0.rc3) lib/active_record/relation/delegation.rb:46:in `each'
app/views/quantifieds/index.html.erb:9:in `_app_views_quantifieds_index_html_erb__3407997734302574408_70263238235460'
actionview (4.2.0.rc3) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.0.rc3) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.0.rc3) lib/action_view/template.rb:143:in `render'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.0.rc3) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:52:in `render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/template_renderer.rb:14:in `render'
actionview (4.2.0.rc3) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionview (4.2.0.rc3) lib/action_view/renderer/renderer.rb:23:in `render'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:100:in `_render_template'
actionpack (4.2.0.rc3) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:32:in `render_to_body'
actionpack (4.2.0.rc3) lib/action_controller/metal/renderers.rb:37:in `render_to_body'
actionpack (4.2.0.rc3) lib/abstract_controller/rendering.rb:25:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:16:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render'
activesupport (4.2.0.rc3) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/benchmark.rb:294:in `realtime'
activesupport (4.2.0.rc3) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:41:in `block in render'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:84:in `cleanup_view_runtime'
activerecord (4.2.0.rc3) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:40:in `render'
actionpack (4.2.0.rc3) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
actionpack (4.2.0.rc3) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (4.2.0.rc3) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.0.rc3) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:92:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:92:in `_run_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0.rc3) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0.rc3) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.0.rc3) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.0.rc3) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.0.rc3) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.0.rc3) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.0.rc3) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.0.rc3) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.2.0.rc3) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.0.rc3) lib/action_controller/metal.rb:236:in `block in action'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:73:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:42:in `serve'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:30:in `each'
actionpack (4.2.0.rc3) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.0.rc3) lib/action_dispatch/routing/route_set.rb:802:in `call'
warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
warden (1.2.3) lib/warden/manager.rb:34:in `catch'
warden (1.2.3) lib/warden/manager.rb:34:in `call'
rack (1.6.0) lib/rack/etag.rb:24:in `call'
rack (1.6.0) lib/rack/conditionalget.rb:25:in `call'
rack (1.6.0) lib/rack/head.rb:13:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.0) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.0) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.0.rc3) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.0.rc3) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
activerecord (4.2.0.rc3) lib/active_record/migration.rb:378:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:88:in `call'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:88:in `_run_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
activesupport (4.2.0.rc3) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.0.rc3) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.0.rc3) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.0) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.0) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.0.rc3) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.0) lib/rack/lock.rb:17:in `call'
actionpack (4.2.0.rc3) lib/action_dispatch/middleware/static.rb:113:in `call'
rack (1.6.0) lib/rack/sendfile.rb:113:in `call'
railties (4.2.0.rc3) lib/rails/engine.rb:518:in `call'
railties (4.2.0.rc3) lib/rails/application.rb:164:in `call'
rack (1.6.0) lib/rack/lock.rb:17:in `call'
rack (1.6.0) lib/rack/content_length.rb:15:in `call'
rack (1.6.0) lib/rack/handler/webrick.rb:89:in `service'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
/Users/galli01anthony/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
Answer to Your Specific Problem:
@quantified = Result.all.order("date_value")
.all
before .order
is the cause of your error..all
command immediately triggers a fetch of items from the database. .where
and .order
exist to shape how (or what) data is fetched from the database, you need to call them in your code before a database retrieval gets triggered by a command like .all
: @quantified = Result.order("date_value").all
Result.order("date_value ASC").all
, or if the data always gets used in this order, to make your ordering a default_scope
within the Result
model.
General Advice When Debugging
Undefined Method
"method_name" errors:undefined method "method_name"
errors are not actually caused by method_name
being undefined
, but rather because the object itself is nil
or an incorrect class.NoMethodError: undefined method 'method_name'
can be a red herring that misleads you when you have an object that isn't loaded or instantiated.class
is defined correctly before you start trying to debug it. Without doing this, it's very easy to go down a rabbit hole looking into problems that might exist with method_name, when really the problem lies with your object not existing. undefined method
error just look for the for xxx:Class
part of the error. This describes the object & its class. If your object is nil or doesn't exist, the undefined method error will display for nil:NilClass
.NoMethodError: undefined method `date_time' for nil:NilClass
date_time
part of this error message, and not that the NoMethodError
message is referencing a nil class. In a NoMethodError like above where our object is nil, 'date_time'
simply represents a point in code where we unsucessfully called a method against a nil
object. To solve a NoMethodError on a nil:NilClass object correctly, what matters is looking into why the object itself is not instantiating.