0

私のバックグラウンドは Java Web サービスですが、ROR に移行しようとしています。

FlexImage を使用して、画像のアップロードとサムネイルの生成を処理しています。ガイドに従ったところ、ある時点で CRUD の動作が正常に機能していました。しかし、ある時点で、モデル (イメージ) の 1 つの CRUD 動作が壊れました。

返されたエラー コードは次のとおりです。ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.つまり、Rails に作成/更新/破棄を指示しているときに、オブジェクトと ID を混同しています。これは、ルーティングの問題がある可能性があることを示しているようです。画像の部分的な追加が問題だったのではないかと思いましたが、変更をロールバックしても修正されませんでした。

以下は、Images モデルのコントローラーの new、show、および update メソッドです。

      # images_controller.rb

        # ...

      def new
        @image = Image.new

        respond_to do |format|
          format.html # new.html.erb
          format.xml  { render :xml => @image }
        end
      end

    # ...
  def show
    @image = Image.find(params[:id])

    respond_to do |format|
      format.jpg  # show.jpg.erb 
      format.html # show.html.erb
      format.xml  { render :xml => @image }
    end
  end



    # ...

      def create
        @image = Image.new(params[:image])

        if @image.save 
        redirect_to image_url(@image)
        else
        flash[:notice] = 'Your image did not pass validation.'
        render :action => 'new'
        end
      end 
     # ...

もちろん、show() は適切な ID を期待していることに注意してください。新しい画像をアップロードするための new.html.erb は次のとおりです。

# new.html.erb [upload image]
<h1>New image</h1>

<% form_for @image, :html => { :multipart => true } do |f| %>
  <%= f.error_messages %>
  <table><tr><td width="50%">
  <p>
    <%= f.label :filename %><br />
    <%= f.text_field :filename %></p>
  </td>
  <td><p><b>Upload Image</b><br />
    <%= f.file_field :image_file %><br />
    or URL: <%= f.text_field :image_file_url %>
    <%= f.hidden_field :image_file_temp %>
  </td>
  <td>
    <b>Uploaded Image:</b><br />
    <%= embedded_image_tag(@image.operate { |img| img.resize 100 }) if @image.has_image? %>
  </td>
  </tr>

  </table>
  <p>
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', images_path %>

routes.rb の関連部分は次のとおりです。

# routes.rb [excerpt]

  map.resources :images
  map.image 'images/:action/:id.:format', :controller => 'images'

また、新しい画像が実際にアップロードされ、リダイレクト時にエラーがスローされて表示されることに注意してください (params[:id] に有効な ID が必要であり、何らかの理由で渡されるオブジェクトではありません)。

前もってご協力いただきありがとうございます。何か気になる点がありましたらお知らせください。

4

3 に答える 3

5

コードを見ると、 RESTful 以外のルートimage_url(@image)と組み合わせて使用​​すると問題が発生する可能性があるようです。image

あなたはおそらく行を削除したいと思うでしょう

map.image 'images/:action/:id.:format', :controller => 'images'

あなたからroutes.rb

この線

map.resources :images

ですべての CRUD アクションを公開するには、実際には十分なはずImagesControllerです。

于 2009-05-14T18:25:18.603 に答える
1

私の提案は、ruby-debug を使用して、Image.find 呼び出しの直前にブレーク ポイントを設定することです。params[:id] を調べて、それが実際に何であるかを確認します。

よりゲットーなアプローチとして、これを Image.find 呼び出しの前に置きます

logger.info params[:id].class

その変数の内容を確認します。それを操作する前に何らかのフィルターがある可能性はありますか?

于 2009-05-14T18:14:14.527 に答える
0

試す

  redirect_to :action => "show", :id => @image

リダイレクトをコーディングするより慣用的な方法だと思います。そして、RESTful ルートに関する molf のアドバイスに +1 します。

于 2009-05-14T18:33:38.770 に答える