form_for с несколькими действиями контроллера для отправки - PullRequest
7 голосов
/ 13 августа 2011

Как передать URL в форму для отправки? Я пытаюсь использовать одну форму с каждой кнопкой, указывающей на действия каждого контроллера, одна - поиск, а другая - создание. Можно ли иметь 2 кнопки отправки с разными действиями в одной форме?

<%= form_for @people do |f| %>
    <%= f.label :first_name %>:
    <%= f.text_field :first_name %><br />

    <%= f.label :last_name %>:
    <%= f.text_field :last_name %><br />

    <%= f.submit(:url => '/people/search') %>
    <%= f.submit(:url => '/people/create') %>
<% end %>

Ответы [ 2 ]

20 голосов
/ 13 августа 2011

Не существует простого способа Rails отправить форму на разные URL в зависимости от нажатой кнопки. Вы можете использовать javascript на каждой кнопке для отправки на разные URL-адреса, но более распространенный способ справиться с этой ситуацией - позволить форме отправлять один URL-адрес и определять, какая кнопка была нажата в действии контроллера.

Для второго подхода с кнопками отправки вот так:

<%= form_for @people do |f| %>
  # form fields here
  <%= submit_tag "First Button", :name => 'first_button' %>
  <%= submit_tag "Second Button", :name => 'second_button' %>
<% end %>

Ваше действие будет выглядеть примерно так:

def create
  if params[:first_button]
    # Do stuff for first button submit
  elsif params[:second_button]
    # Do stuff for second button submit
  end
end

См. этот похожий вопрос , чтобы узнать больше об обоих подходах.

Также см. Эпизод Railscast 38 для многокнопочных форм.

2 голосов
/ 22 июля 2015

Этот вопрос очень похож на на этот , хотя он немного отличается

Я просто хотел подчеркнуть, что в некотором ответе на вышеупомянутый вопрос также предлагалось добавить ограничения на маршруты, чтобы вы могли фактически направлять запросы к различным действиям контроллера!

Кредиты автору, vss123

Мы решили использовать расширенные ограничения в рельсах.

Идея состоит в том, чтобы иметь один и тот же путь (и, следовательно, один и тот же названный маршрут и действие), но с ограничениями, направляемыми на различные действия.

resources :plan do   
  post :save, constraints: CommitParamRouting.new("Propose"), action: :propose
  post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize 
end

CommitParamRouting - это простой класс, у которого есть метод match? который возвращает true, если параметр commit соответствует заданному экземпляру attr. значение.

Доступно как гем commit_param_matching.

...