2017-02-15 31 views
0

У меня есть две ссылки (могут быть кнопками, если это необходимо), которые говорят «принять» и «отклонить», и мне нужно отправить истинные или ложные параметры в действие моего контроллера, щелкнув одну из этих ссылок. Я не хочу, чтобы мои параметры были видимыми в URL-адресе, поэтому мне нужно использовать метод put. Я пробовал с link_to с определенным методом:Отправка параметров через кнопку на рельсах form_tag с методом put

<%= link_to 'accept', { action: 'accept_offer', accept: true }, method: :put %> 
<%= link_to 'decline', { action: 'accept_offer', accept: false }, method: :put %> 

но мои параметры все еще видны.

Я пробовал использовать button_to, но тогда мои параметры не передаются. Каков наилучший способ определить, какой вариант был выбран (принять или отклонить), не указав параметры в URL-адресе?

мой маршрут определяется следующим образом:

put 'offers', to: 'offers#accept_offer' 

ответ

1

Я рекомендую сделать форму вместо link_to и передать параметры в имени. Используйте форму и отправьте информацию. Это может потребовать дополнительный код на исходных страницах, но не требует логических изменений на целевых страницах.

<% form_for @offer, :url => {:action => 'accept_offer'} do |f|%> 
    <%= submit_tag "", :value => "Accept":name => "accept" %> 
    <%= submit_tag "", :value => "Decline":name => "decline" %> 
<% end %> 

в своем действии вы получите Params [: принять] или [Титулы: спад], основанные на ссылке, которую вы кликнули.

+0

Поскольку мне нужно было просто передать параметры в действие контроллера, чтобы определить поток действий, мне удалось использовать ваше предложение с submit_tag внутри form_tag с моим действием и методом put. благодаря – mara

-1

Начните с обычных маршрутов:

resources :offers 

Затем позволяет использовать button_to создать дискретную форму:

<%= button_to 'accept', @offer, method: :patch, params: { "offer[accept]" => true } %> 
<%= button_to 'decline', @offer, method: :patch, params: { "offer[accept]" => false } %> 

Опция params создает скрытые входы внутри формы.

Затем убедитесь, что вы белый список правильный атрибут:

class OffersController < ApplicationController 
    def update 
    @offer = Offer.find(params[:id]) 

    if @offer.update(offer_params) 
     redirect_to @offer, success: 'Offer updated' 
    else 
     render :new 
    end 
    end 

    def offer_params 
    params.require(:offer).permit(:accept, :foo, :bar) 
    end 
end 

Если вам нужно иметь отдельную логику от регулярного обновления затем создать два дополнительных глаголов:

resources :offers do 
    member do 
    patch :accept 
    patch :decline 
    end 
end 

<%= button_to 'accept', accept_offer_path(@offer), method: :patch %> 
<%= button_to 'decline', decline_offer_path(@offer), method: :patch %> 

Это позволяет сохранить ваш API в состоянии покоя и decriptive.

 Смежные вопросы

  • Нет связанных вопросов^_^