ControlPanelController también conocido como control_panel_controller.rb es mi código de controlador principal en el que quiero manejar toda la logística. La clase de imagen, también conocida como picture.rb, es el modelo que uso.

En mis recursos tengo

resource :control_panel, only: [:index, :new, :create, :destroy], controller: 'control_panel'

Las rutas del rastrillo me muestran

   control_panel POST   /control_panel(.:format)     control_panel#create
new_control_panel GET    /control_panel/new(.:format) control_panel#new
                  DELETE /control_panel(.:format)     control_panel#destroy

Aquí está mi ControllerPanelController

class ControlPanelController < ApplicationController

      def index
        @pictures = Picture.all
      end 

      def new 
        @picture = Picture.new
      end 

      def create
        @picture = Picture.new(picture_params)
        if @picture.save
          redirect_to control_panel_path, notice: "The picture #{@picture.name} has been uploaded."
        else
          render "new"
        end 
      end 

      def destroy
        @picture = Picture.find(params[:id])
        @picture.destroy
        redirect_to control_panel_path, notice:  "The picture #{@picture.name} has been deleted."
      end 

    private
      def picture_params
        params.require(:picture).permit(:name, :attachment)
      end 
    end

En mi app/views/control_panel/new.html.erb uso url: control_panel_path(@picture) para poder publicar en el método de creación de ControlPanel, pero no funciona. yo obtengo

ERROR 1:

Ninguna ruta coincide con [GET] "/ control_panel"

<% if !@picture.errors.empty? %>
    <div class="alert alert-error">
      <ul>
        <% @picture.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%= form_for @picture, url: control_panel_path(@picture), :html => {:multipart => true} do |f| %>
    <p> 
      <%= f.label :name %><br />
      <%= f.text_field :name %>
    </p>
    <p> 
      <%= f.file_field :image %>
    </p>
    <p> 
      <%= f.label :remote_image_url, "or image URL" %><br />
      <%= f.text_field :remote_image_url %>
    </p>
    <p><%= f.submit %></p>
  <% end %>

ERROR 2: Cuando intento eliminar un recurso de index. yo obtengo

Couldn't find Picture without an ID

Extracted source (around line #22): 

  def destroy
    @picture = Picture.find(params[:id])
    @picture.destroy
    redirect_to control_panel_path, notice:  "The picture #{@picture.name} has been deleted."
  end

La línea 22 en ese caso es @picture = Picture.find (params [: id])

Entonces, ¿cuál es la forma correcta de arreglar mis rutas? Estoy usando recursos en lugar de recursos debido a que solo tengo un panel de control, ya que es una aplicación para un solo usuario en lugar de varios.

EDITAR: código para app / views / control_panel / index.html.erb

<h1>Control Panel</h1>
<p>Manage all your pictures here</p>

<% if !flash[:notice].blank? %>
  <div class="alert alert-info">
  <%= flash[:notice] %>
  </div>
<% end %>
<br />
<%= link_to "Add Picture", new_control_panel_path, class: "btn btn-primary" %>
<br />
<br />
<table class="table table-bordered table-striped">
  <thead>
    <tr>
      <th>Name</th>
      <th>Picture</th>
      <th>&nbsp;</th>
    </tr>
  </thead>
  <tbody>
    <% @pictures.each do |picture| %>
      <tr>
        <td><%= picture.name %></td>
        <td><%= image_tag picture.image_url(:thumb) %></td>
        <td><%= button_to "Delete", control_panel_path(picture), method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #{pi
      </tr>
    <% end %>
  </tbody>
</table>


**EDIT 2:**

Conseguí que la eliminación funcionara arreglando el código button_to como tal

<td><%= button_to "Delete", control_panel_path(picture.id), method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #
      </tr>
0
CodeCrack 5 feb. 2015 a las 04:53

2 respuestas

La mejor respuesta

ERROR 1

Recibes el error porque tu aplicación no tiene una ruta correspondiente a [GET] "/ control_panel". Agregue: muestre a sus rutas control_panel y muestre la acción a su ControlPanelController. También recuerde que el recurso singular no tiene: ruta / acción de índice.

http://guides.rubyonrails.org/routing.html#singular-resources

ERROR 2

Obtiene el error porque params [: id] es nulo. control_panel_path(picture) no establece params[:id] porque estás usando control_panel_path y no pictures_path. Intente pasar id como parámetro GET: control_panel_path(id: picture.id).

Los recursos anidados también son una buena forma de hacerlo: http://guides.rubyonrails.org/routing .html # recursos-anidados

1
tyamagu2 5 feb. 2015 a las 03:29

Parece que su ruta control_panel # destroy no toma id param.
Utilice "resourece s " en lugar de "recurso" como se muestra a continuación.

resources :control_panel, only: [:index, :new, :create, :destroy], controller: 'control_panel'

Esto genera una ruta como esta.

control_panel_index GET      /control_panel(.:format)
                    POST     /control_panel(.:format)
new_control_panel   GET      /control_panel/new(.:format)
control_panel       DELETE   /control_panel/:id(.:format)
0
kengo 5 feb. 2015 a las 03:24