Pergunta

Assim, a minha formação é em serviços web Java, mas eu estou tentando fazer a mudança para ROR.

Eu estou usando Fleximage para lidar com upload de imagens e miniaturas geração. Eu segui o guia eo comportamento CRUD estava funcionando bem em um ponto. No entanto, em algum momento, o comportamento CRUD para um dos meus modelos (Imagens) foi quebrado.

O código de erro que estou recebendo de volta é a seguinte: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. Em outras palavras, quando eu estou dizendo Rails para criar / atualizar / destruir, é confundir o objeto com o id. Isto parece indicar que pode haver um problema de roteamento. Eu pensei que a adição de uma parcial para imagens pode ter sido o problema, mas reverter as mudanças não corrigi-lo.

A seguir estão os novos, mostrar e atualizar métodos do controlador para o modelo de Imagens:

      # 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 
     # ...

Note que show () é, obviamente, esperando um id apropriado. Aqui está o new.html.erb para enviar uma nova imagem:

# 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 %>

A parte relevante do routes.rb são os seguintes:

# routes.rb [excerpt]

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

Observe também que uma nova imagem faz realmente começar carregado e o erro é lançado no redirecionamento para show (que está esperando uma identificação válida na params [: id] e não o objeto que por qualquer motivo ele está sendo entregue.)

Obrigado por sua ajuda com antecedência, e por favor deixe-me saber se alguma coisa salta para fora em você.

Foi útil?

Solução

De olhar para o código parece-me que o problema pode ser causado pelo uso de image_url(@image) em combinação com a rota image não-RESTful.

Você provavelmente vai querer remover a linha

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

de sua routes.rb.

A linha

map.resources :images

deve realmente ser o suficiente para expor todas as ações CRUD em sua ImagesController.

Outras dicas

A minha sugestão é usar ruby-debug e definir um certo ponto de quebra antes da chamada Image.find. Inspecione params [: id] e ver o que realmente é.

Uma abordagem mais gueto, colocar isso antes da chamada Image.find

logger.info params[:id].class

e ver o que é nessa variável. É possível que você tem algum tipo de antes de filtro que está manipulando isso?

try

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

Eu acho que é uma forma mais idiomática ao código de redirecionamento. E uma para o conselho molf de cerca de rotas RESTful.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top