Mongoid embeds_one form_for新对象的路径错误

时间:2010-12-01 21:55:48

标签: ruby-on-rails resources path nested

您是否可以将同一模型类作为一个集合资源,另一个是单一资源?


更新!!!

我认为它是一个mongoid问题,因为编辑现有的照片是有效的。只有新抛出路径错误


ORM是Mongoid beta 20


routes.db

  resources :products do
     resources :photos do
        collection do
           post 'sort'
         end
     end
   end

   resources :companies do
      resource :photo
   end

photos_controller.rb

before_filter find_or_build_photo

  def find_or_build_photo
    # these have many photos
    if !params[:story_id].blank? or !params[:product_id].blank?
    @photo = params[:id] ? @parent.photos.find(params[:id]) :     @parent.photos.build(params[:photo])
    end
    # these have one photo
    if !params[:company_id].blank?
    @photo = @parent.photo ? @parent.photo : @parent.build_photo(params[:photo])
    end
  end

我在form_for帮助器的视图中得到了一些“未定义的方法photo_path”等错误。 我的Theorie - >因为只有“照片” - 控制器而没有“照片”控制器。这混淆了路径 - blackmagic!?

Started GET "/companies/4cf6b9c3499dda12e3000003/photo/edit" for 127.0.0.1 at Thu Dec 02    17:51:42 +0100 2010
  Processing by PhotosController#edit as HTML
  Parameters: {"company_id"=>"4cf6b9c3499dda12e3000003"}
mcu_dev['companies'].find({:_id=>BSON::ObjectId('4cf6b9c3499dda12e3000003')},     {}).limit(-1)
Rendered photos/_form.html.haml (3893.3ms)
Rendered photos/edit.html.haml within layouts/application (3899.1ms)
Completed   in 6730ms

ActionView::Template::Error (undefined method `company_photos_path' for #<#    <Class:0x103842e30>:0x1038404a0>):
    1: 
    2: 
    3: = form_for [@parent, @photo], :html => { :multipart => true } do |f|
    4:   -if @photo.errors.any?
    5:     #errorExplanation
    6:       %h2= "#{pluralize(@photo.errors.count, "error")} prohibited this photo from    being saved:"
  app/views/photos/_form.html.haml:3:in    `_app_views_photos__form_html_haml___1111817113_2176907420_506750'
  app/views/photos/edit.html.haml:3:in  `_app_views_photos_edit_html_haml__1185726823_2176970040_0'
  lib/include/flash_session_cookie_middleware.rb:16:in `call'

当我调试它时。设置实例变量:

http://img4.imageshack.us/img4/6892/rubyerror.png


完整来源:github.com/banditj/mongoid-carrierwave-uploadify

3 个答案:

答案 0 :(得分:1)

是的,你可以。

您获得undefined method photo_path的原因是因为您没有使用已定义的嵌套资源。

在你的form_for中你应该这样做:

<%= form_for [@company, :photo] do |f| %>

@company是预先存在的公司对象。

答案 1 :(得分:0)

尝试覆盖网址:

<%= form_for [@company, @photo], :url => company_photo_path(@company) do |f| %>
<% end %>

这应该给你一个POST到PhotosController #create的表单。你可能想做一个PUT,因为你的控制器拿起照片(如果它存在),在这种情况下你还需要传递:html => { :method => :put },这应该转到PhotosController#update。

答案 2 :(得分:0)

find_or_build_photo方法变得非常臭。

感觉您不必要地重载Photo模型。拥有许多照片的产品与公司的化身不同。

Plus Mongoid被Photo中的多个embedded_in声明搞糊涂了。

我建议创建第二个名为Avatar的模型,以满足单一资源需求,例如向公司或个人添加照片。将照片用于产品或故事中的多个条目。

这是现实世界的更好模型。它还允许为Avatar和Photo设置不同的大小。通常我扔掉原版,只在“阿凡达”中制作一个或两个小尺寸。对于Photo,我会保留原版并制作四到五种不同尺寸,以便在我的故事中更灵活地呈现。

公司将embeds_one :avatar。产品将embeds_many :photos

这种干净的目的分离应解决路线中单一与多种资源的问题。

对于头像,不需要Uploadify。只需使用标准文件上传表单元素即可。它很简单,可以添加到更大的公司表格中。