Quiero añadir otra acción a mi controlador, y yo no puedo entender cómo.

He encontrado esto en RailsCasts, y en la mayoría de StackOverflow temas:

# routes.rb
resources :items, :collection => {:schedule => :post, :save_scheduling => :put}

# items_controller.rb
  ...
  def schedule
  end

  def save_scheduling
  end

# items index view:
<%= link_to 'Schedule', schedule_item_path(item) %>

Pero me da el error:

undefined method `schedule_item_path' for #<#<Class:0x6287b50>:0x62730c0>

No está seguro de a donde debo ir de aquí.

InformationsquelleAutor user1885058 | 2012-12-07

3 Comentarios

  1. 49

    Una forma original de escribir

    resources :items, :collection => {:schedule => :post, :save_scheduling => :put}

    es

    resources :items do
      collection do
        post :schedule
        put :save_scheduling
      end
    end

    Esto va a crear URLs como

    • /items/schedule
    • /items/save_scheduling

    Ya que está pasando un item en su schedule_... método de la ruta, es posible que quiera member rutas en lugar de collection rutas.

    resources :items do
      member do
        post :schedule
        put :save_scheduling
      end
    end

    Esto va a crear URLs como

    • /items/:id/schedule
    • /items/:id/save_scheduling

    Ahora un método de la ruta schedule_item_path aceptar una Item instancia estará disponible. El problema final es, su link_to tal y como está va a generar un GET petición, no una POST solicitud como su ruta requiere. Usted necesita especificar esta como un :method opción.

    link_to("Title here", schedule_item_path(item), method: :post, ...)

    Lectura Recomendada: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

    • un put de colección?
    • Esto es por qué creo que el OP se supone que tienen member colecciones, como se describe en mi respuesta.
    • ok, no prestar atención al comentario de abajo, +1
    • Para obtener el link_to de trabajo que tenía que hacer esto: <%= link_to 'Schedule', schedule_item_path(item), method: :post %> Aviso de la method: :post está fuera de la schedule_item_path()
    • sí, pequeño error tipográfico. fijo.
  2. 1

    Puede escribir routes.rb como este:

    match "items/schedule" => "items#schedule", :via => :post, :as => :schedule_item
    match "items/save_scheduling" => "items#save_scheduling", :via => :put, :as => :save_scheduling_item

    Y la link_to ayudante no puede enviar post verbo en Rails 3.

    Se puede ver el Rieles de Enrutamiento desde el Exterior En

    • Muy detallado y será más difícil de mantener.
    • Hay otra forma de generar el específico _path método?
    • (véase mi respuesta)

Dejar respuesta

Please enter your comment!
Please enter your name here