Rails 3 Route: button_to HTML INPUT Действие не работает - PullRequest
0 голосов
/ 05 октября 2011

У меня странная проблема, которая, как мне кажется, связана с маршрутами.

В моем «представлении» у меня есть следующее:

<%= button_to "New Item", new_proposal_pitem_path(@proposal), :method => :get %>

Я хочу нажать «Новый элемент»и создайте новый пункт для предложения.Это генерирует HTML-код, который я ожидал бы:

<form method="get" action="/proposals/1234/pitems/new" ...><input ...></form>

Однако, что действительно происходит, когда я нажимаю на кнопку, он пытается получить GET для / предложений / 1234, а не / предложений / 1234 / pitems / new.Это дает мне страницу «шоу», а не «новую» страницу.Интересно, что я могу вручную поместить {site} / offer / 1234 / pitems / new прямо в HTTP-адрес веб-браузера и получить то, что я хочу («новая» страница).Но rails, сам по себе, сначала переводит его в / предложений / 1234, если я оставляю его себе в ответ на нажатие кнопки.

Чтобы сделать это более загадочным, у меня есть аналогичный предмет на том же самомформа, которая выглядит точно так же:

<%= button_to "New Payment", new_proposal_payment_path(@proposal), :method => :get %>

, которая генерирует тот же HTML, что и в другом случае:

<form method="get" action="/proposals/1234/payments/new" ...><input ...></form>

Но этот работает!Когда я нажимаю кнопку, я получаю право на / предложений / 1234 / платежи / новый, как я и ожидал.Я просто не понимаю, что заставляет их вести себя по-разному.

Мой файл полных маршрутов выглядит так:

TCoB::Application.routes.draw do
  resources :proposals do
    resources :pitems, :payments
    get 'list', :on => :collection
  end

  resources :pitems do
    get 'list', :on => :collection
  end

  resources :invoices do
    resources :iitems, :payments
    get 'list', :on => :collection
  end

  resources :iitems do
    get 'list', :on => :collection
  end

  resources :payments do
    get 'list', :on => :collection
  end

  resources :ids

  resources :clients do
    resources :proposals, :invoices
    # Route GET /cients/list
    get 'list', :on => :collection
    get 'list_proposals', :on => :collection
    get 'list_invoices', :on => :collection
  end

  get "home/index"

  root :to => "home#index"
end

Может кто-нибудь пролить свет на эту проблему?

Спасибо!

1 Ответ

1 голос
/ 06 октября 2011

Маленький вспомогательный метод, использующий JavaScript:

def button_link_to(name, url)
  "<button type=\"button\" onclick=\"window.location.href='#{url}';\">#{h(name)}</button>".html_safe
end


button_link_to "New Item", new_proposal_pitem_path(@proposal)
...