Проблемы при маршрутизации в Rails - PullRequest
0 голосов
/ 25 сентября 2018

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

Мой маршрут такой:

  get '/account/plans', to: 'accounts#plans'
  post '/account/change_plan', to: 'accounts#change_plan'
  get '/account/change_plan', to: 'accounts#plans'

На моем контроллере у меня есть:

#accounts_controller.rb
  def change_plan
    @plan = Plan.find(params[:plan])
    current_user.plan = @plan
    current_user.save
    render 'payment_options'
  end

и, на мой взгляд, у меня есть:

 <div class="plan-details">
    <header class= <%= plan.css %> >
      <h3><%= plan.name %></h3>
      <small><%= plan.visibility %></small>      
      <p><%= plan.card_description.html_safe %></p>
      <span class="plan-price"><sup>$</sup><%= plan.amount.to_s %></span>
    </header>
    <article>
     <%= plan.features_description.html_safe %>
      <%= link_to button_text,  account_change_plan_path, title: button_text, :class=>"btn btn-md btn-block btn-outline-green" %>
    </article>
 </div><!-- end plan details -->

Но когда я нажимаю эту кнопку, отображается сообщение:

No route matches [GET] "/account/change_plan"

Почему, когда я нажимаю кнопку, в журнале сервера появляется сообщение:

Processing by AccountsController#plans as HTML

, а не ОбрабатываетсяAccountsController # change_plan как HTML

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Здесь происходит несколько вещей, похоже, что

Вы используете link_to для кнопки отправки вместо кнопки отправки формы.По умолчанию link_to делает GET-запросы.Вместо этого вы должны указать ему отправить запрос POST, поскольку именно так определяется ваш маршрут.

Изменить

<%= link_to button_text,  account_change_plan_path, title: button_text, :class=>"btn btn-md btn-block btn-outline-green" %>

На

<%= link_to button_text,  account_change_plan_path, method:  :post, title: button_text, :class=>"btn btn-md btn-block btn-outline-green" %>

См. https://api.rubyonrails.org/v5.2.1/classes/ActionView/Helpers/UrlHelper.html о том, как использовать link_to.

Во-вторых, в вашем маршруте нет параметра для «плана», и вы не отправляете его с помощью link_to, поэтому даже после исправленияваша ссылка, ваше действие не сможет найти план.Вы должны изменить свой маршрут на:

post '/account/change_plan/:plan', to: 'accounts#change_plan'

, а затем изменить свой link_to на (при условии, что вы используете plan.id в качестве идентификатора вашего плана):

<%= link_to button_text,  account_change_plan_path(plan.id), method:  :post, title: button_text, :class=>"btn btn-md btn-block btn-outline-green" %>
0 голосов
/ 25 сентября 2018

Вам нужно вызвать POST-действие и передать plan params {plan: plan.id}

<%= link_to button_text, 
    account_change_plan_path({plan: plan.id}), 
    method: :post, 
    title: button_text, 
    class: "btn btn-md btn-block btn-outline-green" %>
0 голосов
/ 25 сентября 2018

Вы определили свой маршрут как POST, но ваша ссылка делает GET.

Это должно работать:

<%= link_to button_text, account_change_plan_path(plan_id: plan.id), title: button_text, class: "btn btn-md btn-block btn-outline-green", method: :post %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...