0

ArtworksのリソースにArtworks使用しているモデルのフォームがプロジェクトにあります。fields_forPhotohas_many :photos

Photoモデルはペーパークリップを使用して画像を添付します。

私のフォームはすべてAJAXベースです。つまり、ページをリロードしてはならずredirect_to、コントローラーのどこでも使用してはいけません(私はそうではありません)。

フォームにペーパークリップfile_fieldを含めたときにfields_for、フォームを送信するときに写真を作成または更新すると、次のエラーが発生します。

Template is missing

Missing template artworks/show, application/show with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * "/home/david/rails/piml_artwork/app/views" * "/home/david/.rvm/gems/ruby-1.9.3-p194/gems/devise-2.1.2/app/views"

画像を破棄するチェックボックスは期待どおりに機能します。フォームの残りの詳細を更新して送信すると、AJAX応答を返し、ページに入力するだけで、期待どおりに機能します。

私のアートワークコントローラーは次のとおりです。

  class ArtworksController < ApplicationController
    before_filter :load

    authorize_resource

    respond_to :html, :json, :js

    def load
    end

    def show
      @artwork = Artwork.find(params[:id])
    end

    def index
      @artworks = Artwork.all
    end

    def new
      @artwork = Artwork.new
      @artwork.photos.build unless @artwork.photos.count > 0
    end

    def create
      @artwork = Artwork.new(params[:artwork])
      if @artwork.save
        flash[:notice] = "Artwork saved"
        @artworks = Artwork.all
        respond_with @artwork
      end
    end

    def edit
      @artwork = Artwork.find(params[:id])
      @artwork.photos.build unless @artwork.photos.count > 0
    end

    def update
      @artwork = Artwork.find(params[:id])
      if @artwork.update_attributes(params[:artwork])
        flash[:notice] = "Artwork updated"
        @artworks = Artwork.all
        respond_with @artwork
      end
    end

    def destroy
      @artwork = Artwork.find(params[:id])
      @artwork.destroy
      flash[:notice] = "Artwork destroyed"
      @artworks = Artwork.all
    end
  end

争いを引き起こしている形はこれです:

<%= form_for( @artwork, remote: true, mutlipart: true ) do |f| %>
    <%= render 'layouts/error_messages', object: f.object %>
    <div id="artwork-title">TITLE: <%= f.text_field :title %></div>
    <div id="artwork-title-underline"></div>
    <div id="artwork-show-picture"><%= image_tag @artwork.photos.first.photo.url(:medium) unless @artwork.photos.first.new_record? %>
        <div id="artwork-picture-upload">
            <%= f.fields_for :photos, remote: true, multipart: true do |p| %>
                <% if p.object.new_record? %>
                    UPLOAD PHOTO
                    <%= p.file_field :photo, value: 'Upload Image' %>
                <% else %>
                    REPLACE PHOTO
                    <%= p.file_field :photo, value: 'Replace Image' %>
                    <br />
                    <br />
                    <%= p.check_box :_destroy %>
                    <%= p.label :_destroy, 'Delete Image' %>
                <% end %>
            <% end %> 
        </div>
    </div>
    <div id="artwork-public">
        ARTIST<br />
        <%= f.select :artist_id, Artist.select_list, include_blank: "SELECT ARTIST" %><br />
        <br />
        DATE OF WORK <br />
        <%= f.text_field :date_of_work %><br />
        <br />
    <div id="artwork-modify-buttons">
        <%= f.submit %>
    </div>
<% end %>

更新用のJSファイルは次のとおりです。

    <% if !@artwork.errors.any? %>
      $("#facebox .content").html("<%= escape_javascript(render(partial: "/artworks/show")) %>");
      $("#artworks-col").html(" <%= escape_javascript(render(partial: "/admin/artworks_list" )) %>")
    <% else %>
      $("#facebox .content").html("<%= escape_javascript(render(partial: "/artworks/form")) %>");
    <% end %>
4

1 に答える 1

1

結局のところ、私が抱えていた問題は、設計上、AJAXを介してファイルをアップロードできないことです。

これで数日間苦労した後、私はそれをすべて信じられないほど簡単に修正する宝石を見つけました。Remotipart

それを修正するために私がしなければならなかったことの全体は次のとおりでした:

  • gemファイルにremotipartを追加しますgem 'remotipart'
  • //= require jquery.remotipartapp / Assets / javascripts/application.jsファイルに追加します
  • bundle install

それはそれを修正しました。現在、画像は「AJAX」のように見えるものでアップロードされていますが、実際にはiframeを使用して作業を行っています。

于 2012-10-13T03:21:54.153 に答える