2014-01-30 28 views
0

我有2种型号:渲染通过AJAX嵌套属性(通过jQuery的文件上传图片上传)编辑形式

  1. 大厦→has_many :building_views
  2. BuildingView→belongs_to :building

我可以创建BuildingView仅适用于现有建筑物 - 通过建筑物的编辑窗体。
BuildingView具有imagetitle属性。图像通过Carrierwave上传。
工作流程:

  1. 我去构建
  2. 没有进行编辑的网页我有file_field,允许选择多个文件
  3. 我选择一些图片,他们通过jquery-fileupload-rails宝石(每图像创建BuildingView)
  4. 上传
  5. 上传后,他们出现在编辑窗体(无重新加载页面)与拇指和输入字段编辑BuildingView标题

1,2和3都可以。图像正在上传,BuildingView正在创建,并且在页面重新加载后,它们出现在具有标题编辑输入字段(其也可以被成功编辑)的建筑物的编辑形式中。 4的问题:我不能通过ajax附加BuildingView编辑表单。

这里是我的文件:

控制器/管理/ buildings_controller.rb

# other defs ... 

def edit 
    @building = Building.find(params[:id]) 
end 

def update 
    @building = Building.find(params[:id]) 
    if @building.update_attributes(building_params) 
     flash[:success] = 'Woohoo!' 
     redirect_to admin_buildings_url 
    else 
     render :edit 
    end 
end 

# other defs ... 

private 
    def building_params 
    params.require(:building).permit(:all_building_params, 
             building_views_attributes: [ 
             :_destroy, 
             :id, 
             :building_id, 
             :image, 
             :title 
             ]) 
    end 

的意见/管理/建筑/ edit.html.haml

%h1 Edit building 
= form_for [:admin, @building] do |f| 
    = render 'admin/buildings/form', f: f 
    .form-element-container 
    .form-element.b-form-labels   
    .form-element.b-form-fields 
     = f.submit 'Edit building' 
     = link_to t('admin.cancel'), :back 

= form_for [:admin, BuildingView.new] do |f_bv| 
    = f_bv.hidden_field :building_id, value: @building.id 
    = f_bv.file_field :image, multiple: true, name: 'building_view[image]' 

views/admin/buildings/_form.html.haml

// fields for Building... 

#building_views 
    .form-element-container 
    .form-element 
     %h2 Building views 

= f.fields_for :building_views do |bv_form| 
    = render 'admin/buildings/form_building_views', f: bv_form 

的意见/管理/建筑/ _form_building_views.html.haml

.form-element-container 
    .form-element.b-form-labels Image: 
    .form-element.b-form-fields= image_tag(f.object.image_url(:thumb)) if f.object.image 

.form-element-container 
    .form-element.b-form-labels Title: 
    .form-element.b-form-fields= f.text_field :title 

资产/ JavaScript的/管理/ buildings.js.coffee

jQuery -> 
    $('#building_view_image').fileupload(
    dataType: 'script' 
) 

控制器/ admin/building_views_controller.rb

class Admin::BuildingViewsController < ApplicationController 

    def create 
    @building_view = BuildingView.create(building_view_params) 
    end 

    private 

    def building_view_params 
     params.require(:building_view).permit(:building_id, :image) 
    end 

end 

views/admin/building_views/create.js。HAML

- if @building_view.new_record? 
    == alert('Oops!'); 
- else 
    == $('#building_views').append('#{j render('admin/buildings/form_building_views')}'); 

我选择文件从控制台上传→错误:

ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007ffaa52faad8>:0x007ffaa7393970>): 

所以我需要通过f,当我绘制编辑形式的意见/管理/ building_views /创建。 js.haml
但我无法弄清楚如何。我想:

j render('admin/buildings/form_building_views', f: @building_view) 

但:

ActionView::Template::Error (undefined method `object' for #<BuildingView:0x007ffaa738a348>): 

回答

0

嘛,据我所看到的,我不能接受这f这个部分。所以我手动重新创建。

的意见/管理/建筑/ _form_building_views_ajax.html.haml

.form-element-container 
    .form-element.b-form-labels= image_tag(@building_view.image_url(:thumb)) if @building_view 

    .form-element.b-form-fields= text_field_tag "building[building_views_attributes][#{building_nested_model_count(@building_view, @building)}][title]", nil, placeholder: 'Title' 

= hidden_field_tag "building[building_views_attributes][#{building_nested_model_count(@building_view, @building)}][id]", @building_view.id 

我只是重建形式,其轨道与fields_for帮手产生。 那里有新的帮手:building_nested_model_count(@building_view, @building) - 它计数目前BuildingBuildingViews的数量。我将使用它作为params散列(请参阅idname输入域params)。

我需要更新3个文件。

  1. 定义@building

控制器/管理/ building_views_controller.rb

class Admin::BuildingViewsController < ApplicationController 

    def create 
    @building_view = BuildingView.create(building_view_params) 
    @building = @building_view.building 
    end 

    private 

    def building_view_params 
     params.require(:building_view).permit(:building_id, :image) 
    end 

end 
  1. 添加building_nested_model_count帮手

名助手/管理/ building_views_helper.rb

module Admin::BuildingsHelper 

    def building_nested_model_count(nested_var, building) 
     nested_class = nested_var.class 
     nested_class.where(building_id: building.id).count 
    end 

end 
  1. 和开关部分用于AJAX渲染

视图/管理/ building_views/create.js.haml

- if @building_view.new_record? 
    == alert('Oops!'); 
- else 
    == $('#building_views').append('#{j render('admin/buildings/form_building_views_ajax')}'); 

我不知道是解决这个问题的好方法或是不好的方法,但它起作用:新的BuildingView表单提交后将其保存为db,并将其title保存到数据库。