【问题标题】:Rails 3 association error: undefined methodRails 3关联错误:未定义的方法
【发布时间】:2013-02-14 14:32:47
【问题描述】:

我已经为这个问题困惑了很长一段时间,无法弄清楚。

我有 2 个模型:

class Vehicle < ActiveRecord::Base
  attr_accessible :year, :capacity,
  :size, :body, :model_id, :maker_id, :parameters_attributes

    validates :year, numericality: { greater_than: 1900 }
    validates :year, :capacity, :size, :body, presence: true

    belongs_to :model
    belongs_to :maker
    has_many :parameters
    accepts_nested_attributes_for :parameters
    end

class Parameter < ActiveRecord::Base
  attr_accessible :tag, :value
  validates :tag, :value, presence: true
  belongs_to :vehicle
end

在新车视图中我得到了:

= form_for [:admin, @vehicle], html: { multipart: true } do |f|
    =# some other stuff in between
    = f.text_field :value, size: 4

我收到此错误

undefined method `value'

似乎无法让它工作。有人帮忙吗?

编辑 路线.rb

resources :vehicles 
resources :parameters

resources :makers do
  resources :models
end

【问题讨论】:

    标签: ruby-on-rails methods associations undefined


    【解决方案1】:

    如果你使用嵌套形式,你应该有类似的东西

    f.fields_for :parameters do |parameter|
    

    比:

    parameter.text_field :value, size: 4
    

    另外,记得在控制器中创建一些parameters,例如:

    def new
      @vehicle = Vehicle.new
      2.times { @vehicle.parameters.build } #it will create 2 parameters
    ...
    end
    

    【讨论】:

      【解决方案2】:

      f 指的是@vehicle,好像只有Parameter 有这个字段。这就是它失败的原因。

      旁注:

      • Vehicle 中有accepts_nested_attributes_for :parameters,但在attr_accessible 中没有parameters_attributes,这不好。

      • 如果您想在表单中调用关系,请考虑使用fields_for

      【讨论】:

      • 我已经尝试过了,不再有undefined 错误,但text_field 没有出现。我不太确定 'accepts_nested_attributes_for' 是不是这样,因为我的parameters 没有嵌套在vehicles 中。我将使用routes.rb 和我在模型中所做的更改来编辑我的原始帖子。
      • 路由在这里没有任何作用
      • 使用fields_for,就像我告诉你的那样。如果您一无所有,则意味着您没有构建任何对象。在您的控制器中执行@vehicle.parameters.build
      • 我正在使用fields_for。我在new 方法中做了@vehicle.parameters.build。我得到了undefined method `parameters'
      • 似乎你的关系与 Rails 未知...你尝试重新启动服务器吗?
      【解决方案3】:

      好吧,我把事情搞砸了。

      首先我一直在尝试

      def new
        @vehicle = @vehicle.parameters.build
      end
      

      因此出现错误undefined method。过了一会儿,我得到了正确的语法,这是一段时间后添加的一个 gabrielhilal。

      def new
        @vehicle = Vehicle.new
        @vehicle.parameters.build
      end
      

      不管 ;) 还是有问题,因为点击“创建”后他不会在数据库中添加记录。原来我已经为tag 设置了validates presence: true,但没有为其分配任何值。修复后,它就像一个魅力。非常感谢大家的帮助。

      继续下一个谜题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多