在rails中的不同控制器内部分渲染表单

时间:2013-05-07 11:15:46

标签: ruby-on-rails forms ruby-on-rails-3.2

我有一个项目模型has_many Photos(属于哪些项目),两者都在Admin下命名。 通过表单上传按照预期的方式通过Photo的新动作或编辑动作(但是当从Item show页面呈现时,我得到一个“未定义的方法`model_name'为NilClass:Class”错误。当我创建一个新的照片记录时传递item_id,我不知道要在项目页面上传递什么内容。

PhotosController;

  class Admin::PhotosController < Admin::BaseController
  def new
      @photo = Photo.new(:item_id => params[:item_id])
    end

  def create
    @photo = Photo.new(params[:photo])
    if @photo.save
      flash[:notice] = "Successfully created photo."
      redirect_to [:admin,@photo.item]
    else
      render :action => 'new'
    end
  end

  def edit
    @photo = Photo.find(params[:id])
  end

  def update
    @photo = Photo.find(params[:id])
    if @photo.update_attributes(params[:photo])
      flash[:notice] = "Successfully updated photo."
      redirect_to [:admin,@photo.item]
    else
      render :action => 'edit'
    end
  end

  def destroy
    @photo = Photo.find(params[:id])
    @photo.destroy
    flash[:notice] = "Successfully destroyed photo."
    redirect_to [:admin,@photo.item]
  end
end

照片/ _form.html.haml;

= form_for [:admin,@photo], :html => {:multipart => true,id: 'upload'} do |f|
  = f.hidden_field :item_id
  %p
    = f.label :name
    %br/
    = f.text_field :name
  %p
    = file_field_tag :image, multiple: true, name:'photo[image]',id: 'photo_image'
  %p= f.submit

项/ show.html.haml;

= render 'admin/photos/form'

2 个答案:

答案 0 :(得分:0)

DOH!弄清楚了 渲染调用应该是;

= render 'admin/photos/form', :photo => @item.photos.build

和表格

 = form_for [:admin,photo]

答案 1 :(得分:0)

或者您可以在items_controller #show中创建一个@photo变量

@photo = @item.photos.build 

和你的部分

form_for[:admin,@photo]

我认为这样会更好,因为所有变量都在控制器中分配,而不是控制器中的一个和视图中的另一个。