最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Ruby on rails no method error controller home - Stack Overflow

programmeradmin2浏览0评论

NoMethodError in MainController#home undefined method `id' for nil:NilClass Extracted source (around line #62)

This is the snippet where the error seem to be originated

by_s = WorkflowStateTransition.select(:workflow_state_id).where(by_supervisor: true).collect{|x| x.workflow_state_id }
wp = WorkflowProcess.find_by(workflow: 'Timesheet')
wpr= WorkflowProcess.find_by(workflow: 'Petty Cash Request')
    
by_s = WorkflowStateTransition.joins("INNER JOIN workflow_states ON workflow_states.workflow_state_id = workflow_state_transitions.workflow_state_id")
                                    .where("workflow_states.workflow_process_id = ? AND workflow_state_transitions.by_supervisor = ?", wp.id, true)
                                    .collect{|x| x.workflow_state_id }
by_s_r = WorkflowStateTransition.joins("INNER JOIN workflow_states ON workflow_states.workflow_state_id = workflow_state_transitions.workflow_state_id")
                                      .where("workflow_states.workflow_process_id = ? AND workflow_state_transitions.by_supervisor = ?", wpr.id, true)
                                      .collect{|x| x.workflow_state_id }

NoMethodError in MainController#home undefined method `id' for nil:NilClass Extracted source (around line #62)

This is the snippet where the error seem to be originated

by_s = WorkflowStateTransition.select(:workflow_state_id).where(by_supervisor: true).collect{|x| x.workflow_state_id }
wp = WorkflowProcess.find_by(workflow: 'Timesheet')
wpr= WorkflowProcess.find_by(workflow: 'Petty Cash Request')
    
by_s = WorkflowStateTransition.joins("INNER JOIN workflow_states ON workflow_states.workflow_state_id = workflow_state_transitions.workflow_state_id")
                                    .where("workflow_states.workflow_process_id = ? AND workflow_state_transitions.by_supervisor = ?", wp.id, true)
                                    .collect{|x| x.workflow_state_id }
by_s_r = WorkflowStateTransition.joins("INNER JOIN workflow_states ON workflow_states.workflow_state_id = workflow_state_transitions.workflow_state_id")
                                      .where("workflow_states.workflow_process_id = ? AND workflow_state_transitions.by_supervisor = ?", wpr.id, true)
                                      .collect{|x| x.workflow_state_id }
Share Improve this question edited Mar 7 at 13:02 max 103k15 gold badges113 silver badges176 bronze badges asked Mar 6 at 12:39 Martin PaulMartin Paul 113 bronze badges 2
  • 1 find_by will return nil if there are no database records - which you're not handling. It's also completely unnessicary here as you can quite simply rewrite this to use a subselect .where(workflow_states: { workflow_process_id: WorkflowProcess.where(workflow: 'Timesheet').limit(1) }) and at the same time get rid an additional database query. – max Commented Mar 7 at 12:57
  • While @spickermann's answer does an excellent job at answering why this code fails it's difficult to give you an answer that will actually improve the situation without more context. And yeah this code has a lot of room for improvement. – max Commented Mar 7 at 12:59
Add a comment  | 

1 Answer 1

Reset to default 3

You are calling wp.id and wpr.id in the below queries. Depending on in which line the exception is raised, wp or wpr is nil.

Those variables can only be nil when one or both of these queries do not return any record:

wp  = WorkflowProcess.find_by(workflow: 'Timesheet')
wpr = WorkflowProcess.find_by(workflow: 'Petty Cash Request')

I suggest checking in your DB why those records do not exist.

发布评论

评论列表(0)

  1. 暂无评论