2010-01-24 3 views
0

Я новичок в ruby ​​on rails, и я создал форму со списком с флажками внутри. Я спросил здесь, как получить проверенные значения с параметрами, и я получил его для работы. Теперь идея состоит в том, чтобы выполнить некоторые действия с выбранными элементами, если я нажму на какую-нибудь кнопку, и если я нажму другую, тогда выполните другое действие, но всегда оставайтесь на одной странице после обратной передачи.Проблема после отправки формы

Что происходит сейчас, это то, что я добираюсь до действий, но к другому URL-адресу одновременно. Например:

Я получил следующую форму, на мой взгляд:

form_tag delete_profiles_path, :method => :put do 
    submit_tag 'Delete' 

    @my_announcements.each do |ann| 
     check_box_tag 'announcement[]', ann.id 
     end 
    end 

Мои профили Контроллер:

def delete 
    #some action 
    end 

И routes.rb:

map.resources :profiles, :collection => {:delete => :put} 

Это будет перенаправить меня после отправки:

/профили/полные, и моя форма в /профилей/некоторые/ID-мои объявления

.

Кроме того, что, если я добавлю еще одну кнопку, такую ​​как Удалить, как я могу обрабатывать несколько действий при нажатии на них, но оставаться на одном и том же URL-адресе?

+0

Можете ли вы уточнить - что могла бы сделать другая кнопка? – tfwright

+0

Это просто и пример. Пожалуйста, не сосредотачивайтесь на каких-либо функциях, таких как «удалить», «отредактировать» или какой-либо другой «стандартный» метод с контроллера. Я просто хочу выбрать элементы из списка, а затем нажать кнопку и выполнить действие, оставшееся на одной странице после обратной передачи (как я уже сказал в комментарии ниже первого ответа). –

ответ

0

Прежде всего, почему вы удаляете с помощью метода PUT и DELETE HTTP? Вы должны использовать метод по умолчанию для удаления: используйте :method => :delete и в контроллере #destroy action (вы также можете использовать delete, но это как новый для отображения того, что вы хотите сделать, и destroy - это как update).

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

Thirt - вы не можете «оставаться на одной странице» в Rails (или это будет возможно, но против Rails). Она должна быть такой:

  1. представить форму к действию в контроллере, большую часть времени его URL такой же, как «/ профилей /» или «/ профилей/ID» и действие отличается метод бушель (POST, PUT или DELETE)

  2. отличить, что вы хотите, и попытаться завершить действие. Если это невозможно (например, ошибки проверки), просто покажите ту же форму с фактическими значениями и ошибками, показывающими, почему она не может быть завершена. Если пользователь обновляет страницу и снова передает параметры, он должен получить одинаковые страницы и те же ошибки, и действие также не должно быть завершено.

  3. если этот контроллер завершил запрос, сделайте перенаправление на какую-либо другую страницу. Он работает так, потому что, если пользователь обновляет страницу, тогда (если она была перенаправлена) ничего не происходит, он возвращает новую страницу. Если бы вы не перенаправляли пользователя, то выполняли бы второй раз такое же действие, что не всегда то, что вы хотите.Эта новая страница может быть страница, на которой форма была отправлена ​​из конечно

+0

Хорошо, хорошо. Я бы хотел сделать несколько действий, когда пользователь выбирает элементы из списка, установив флажки. Как только они нажмут кнопку, которую они хотят (удалить был пример), я хочу, чтобы сайт оставался на той же странице, это не сумасшедшее, о чем я прошу. давайте представим, что вы используете Gmail, и вы хотите выбрать пять элементов, а затем нажмите «Архив», вы не будете перенаправлены на другой URL-адрес, вы будете на одном и том же, чем раньше. Я хочу это сделать. Благодарю. –

+0

@Brian Вы уверены, что Gmail остается на одной странице? Я проверил «базовый HTML» (просто чтобы использовать базовую версию HTML, а не фантазию JavaScript), и он перенаправляет после отправки, так что для меня это так же, как я показал в ответ. Он не использует RESTfull URL для этого, но это еще одна история. Если вы хотите сделать это без перезагрузки страницы, вам нужен Ajax, но это немного сложнее. – MBO

+0

Ну, я использую «причудливую» версию, и когда я выбираю несколько электронных писем, а затем нажимаю «Отметить как прочитанное», он будет делать это с помощью ajax. Итак, опять же, мой вопрос заключается в том, как я могу добавить несколько аяксов в форму? –

0

Ну,

Я мог бы частично решить это с помощью Ajax следующим образом:

remote_form_for :profile, :url => {:controller => 'announcements', :action => 'deactivate'}, :html => { :method => :put} do |f| 
    f.submit 'Publish', :confirm => 'Are you sure?' 

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

Кнопка публикации: выполнить некоторые действия в каком-либо контроллере. Кнопка деактивации: выполнить другую.

Это понятно?