当rubx on rails中存在方法时,我正在使用form_for获取未定义的方法

时间:2014-08-06 23:08:22

标签: ruby ruby-on-rails-3 ruby-on-rails-4 form-for activemodel

我在视图中调试控制器中的变量,它向我展示了我希望看到的具有属性的对象:

--- !ruby/hash:Parse::Object
alternativeColour: false
collection: 1
colour: 2
favourite: false
gender: 2
image: !ruby/object:Parse::File
  parse_filename: dcefd915-eee7-4203-840b-sdsdsd34refdd-image3.jpg
  url: http://files.parse.com/erre43-7f16-479f-97e6-343434/dcefd-image3.jpg
price: 23.42
productType: 2
recommended: false
size: 6
title: Bomber Jacket
createdAt: '2014-04-03T20:33:41.020Z'
updatedAt: '2014-06-18T19:03:24.220Z'
objectId: yZkfeeNJPm

在我的控制器中,我有:

  def edit
      @garment = Parse::Query.new("Garments").eq("objectId", params[:id]).get.first
  end

这会获取在另一个页面上单击的项目的objectId,并从parse.com数据库中获取匹配项目,以便我可以编辑任何我想要的内容。

现在我的编辑页面在没有我的表单的情况下加载正常,当我调试控制器var时,我复制并粘贴在它上面的第一段代码。所以我肯定知道我有一个返回的对象。

我甚至使用以下方法测试了一个小提示:

<%= debug @garment["title"] %>

这很好用。所以现在我希望添加我的表单然后创建文本字段的值并选择下拉菜单反映存储在数据库中的特定项目的内容。问题是我得到一个错误,指出:

undefined method `title' for #<Parse::Object:0x007fer0h02y5c0>

这是我的表单:

<%= form_for :garment, :url => adminpanel_url, :html => {:multipart => true} do |f| %>
  <%= f.text_field :title, :class => "formFields", :placeholder => "Title" %> 
  <%= f.text_field :price, :class => "formFields", :placeholder => "Price" %> 
  <%= f.select :recommended, [["Yes", true], ["No", false]], :include_blank => "Make Recommended?" %>
  <%= f.select :alternativeColour, [["Yes", true], ["No", false]], :include_blank => "Alternative Colour?" %>
  <%= f.select :gender, [["Male", 1], ["Female", 2]], :include_blank => "Select Gender" %>
  <%= f.select :productType, [["T-Shirt", 1], ["Shirt", 2], ["Hoody", 3], ["Gilet", 4], ["Jacket", 5]], :include_blank => "Select Product Type" %>
  <%= f.select :size, [["Size 8", 1], ["Size 10", 2], ["Size 12", 3], ["Size 14", 8], ["Small", 4], ["Medium", 5], ["Large", 6], ["X-Large", 7]], :include_blank => "Select Product Size" %>  
  <%= f.select :colour, [["Black", 1], ["Blue", 2], ["Green", 3], ["Grey", 4], ["Navy", 5]], :include_blank => "Select Product Colour" %>
  <%= f.select :collection, [["Tailor Made", 1], ["Raw & Uncut", 2], ["Custom", 3]], :include_blank => "Select Collecton" %>
  <%= f.file_field :image %> 
  <%= f.file_field :image2 %> 
  <%= f.file_field :image3 %> 
  <%= f.file_field :image4 %>
  <%= f.file_field :image5 %>
  <%= f.file_field :image6 %>
  <%= f.submit "Add Item", :id => "addItemButton" %> <br \>
<% end %>

根据我上面的调试结果,我认为我的表单可以正常工作,但它没有,我收到此错误:

undefined method `title' for #<Parse::Object:0x007fff0fedd1e0>

问题是什么?我已经做了一些谷歌搜索并查看了服务器日志,但似乎无法找到问题所在。一旦我删除表单,只是离开调试行,错误就消失了。所以错误肯定是我的形式造成的。

这是我的模型只是让你感到疑惑:

class Garment
    include ActiveAttr::Model
    #include ActiveModel::Validations
    extend CarrierWave::Mount

    attribute :alternativeColour
    attribute :title
    attribute :image
    attribute :image2
    attribute :image3
    attribute :image4
    attribute :image5
    attribute :image6
    attribute :price
    attribute :recommended
    attribute :gender
    attribute :productType
    attribute :size
    attribute :colour 
    attribute :collection

    mount_uploader :image, ImageUploader

帮助将非常感激。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

在做我的原始答案之前......尝试更改控制器代码以实例化你的服装类:

  def edit
      @garment = Garment.new Parse::Query.new("Garments").eq("objectId", params[:id]).get.first
  end

我查看了active_attr代码,如果 Parse::Query正在返回一个哈希(看起来像是这样),它看起来会起作用

旧答案

尝试将此添加到您的Garment类定义中:

def method_missing(method_name, *args)
  if self[method_name.to_s].present?
    self[method_name.to_s]
  else
    super
  end
end

您必须附加到此以使制定者正常工作。

这假设您的Parse::Query调用在某个时刻实例化Garment类。那会发生什么?

答案 1 :(得分:0)

更改:服装到实际对象,即

<%= form_for @garment, :url => adminpanel_url, :html => {:multipart => true} do |f| %>