2016-04-23 68 views
0

我在使用form_fornested_form_fields在Rails中呈现视图。在这里,@procedure_step是一个记录,has_many :procedure_step_actions,其中每个belongs_to :error,这是一个ProcedureError(与其他模型之间的某些关系)整数:code,我试图访问并打印到页面。这是我的模板:可以访问ActiveRecord对象,但不能访问其属性

<%= form_for @procedure_step do |f| %> 
    <%= f.nested_fields_for :procedure_step_actions do |act| %> 
     <%= act.object.error.code %> 
    <% end %> 
<% end %> 

当我运行这个,我得到undefined method 'code' for nil:NilClass。好吧,我的关系搞砸了,我不能访问act.object.error,对吧?改变我的模板来显示,而不是产生#<ProcedureError:0x0000000ece02a8>,这是人们期望的功能关系。使用debug将其内容转储到屏幕上显示记录的所有属性,包括code,但我仍然无法使用原始模板访问它!显然act.object.error不是nil,所以Rails告诉我act.object.errornil对我没有任何意义。

沮丧,我试图通过使用act.object.error.to_json解决该问题。这将打印出具有所有属性的记录的正确JSON。使用JSON.load()就给了我一个正确的Hash的所有属性,但使用[:code]来试图访问代码给我undefined method '[]' for nil:NilClass。同样,我知道该对象不是nil,但Rails仍然拒绝让我访问它。

用尽想法,我试图用正则表达式将代码从原始JSON字符串中提取出来。 /"code":([0-9]+)/.match(act.object.error.to_json)返回#<MatchData "\"code\":69" 1:"69">,这是正确的。我用[1]尝试访问匹配的代码号,但我又得到了undefined method '[]' for nil:NilClass

足够的ActiveRecord,我心想。我决定转向原始的SQL查询。我使用act.object.error_id得到了有关错误的ID,然后将其打印到屏幕上以确保可以访问它。幸运的是,我可以。然后我将它插入我的SQL查询"... WHERE id = #{act.object.error_id}"。我再次刷新页面,并遇到一个SQL错误。它显示了我生成的最终SQL查询字符串,但它以WHERE id =结束。错误的ID没有被添加到字符串中。 ProcedureError.find(action.object.error_id)给出了类似的错误。

我完全没有想法。什么可能阻止我以许多不同的方式访问一个简单的整数?

+0

所以,要明确你的ProcedureStepAction具有'belongs_to:error,class_name:'ProcedureError',foreign_key :: error_id'? – SteveTurczyn

回答

1

有一件事我可以看到马上蝙蝠是你违反了法律德米特这里

act.object.error.code 

的表单对象显然有留下,但你可以通过一种方法在procedure_step代理访问的子对象这可以帮助处理空值和其他错误情况。

尝试委托,因为我不确定由nested_forms_for创建的作用域是否允许ActiveRecord :: Relation对象正确执行。我会仔细检查本地。

代表团可能像下面

class ProcedureStepActions 
    belongs_to :error 
    def error_code 
     @error.code 
    end 
end 

编辑:

可能有帮助的其他事情是红宝石的版本和Rails使用的是和其他任何额外的宝石或库。

+0

我在ProcedureStepAction中添加了一个方法,该方法会引发错误并返回其代码,但它具有与我最初获取的相同的零对象问题。我在Windows 10 x64上使用Rails 4.2.6,Ruby 2.2.3和nested_form_fields 0.7.6。 –

+1

'k我在我的机器上(Rails 3.2,Ruby 2.2.0和Mac)声明了类似的问题,它看起来像其他类似的问题已经报告给该项目的所有者 - https://github.com/ncri/nested_form_fields/issues/55我假设这是要么在lib或Rails中的错误 – noname

+1

我的猜测是前者。我认为这种意大利面条访问并不是真正推荐给AFAIK的复杂模型。您可能只想从ProcedureStepActions继承ProcedureErrors并为错误创建一个cusom工作流 – noname

2

这里至少有几个问题。首先,如果你使用4.x,你可能想要使用fields_for,而不是nested_fields_for

第二个与第一个答案指出的相似。你有一个嵌套的字段形式,它允许你嵌套一个层次,但你试图嵌套两个层次。通过解决违反规则的规则,你应该能够取得更多的进展。

调试这样的东西,你可以通过在你的erb中投入binding.prybyebug来获得更多信息。

<%- binding.pry %> 

然后重新加载页面。您的服务器将在您的代码中停止,您可以使用变量值来了解更多关于正在发生的事情。