Rails 4 — маршрутизация действий для контактной формы

#ruby-on-rails #ruby #post #get #routes

#ruby-on-rails #ruby #Публикация #получить #маршруты

Вопрос:

У меня есть два действия в контроллере:

   def report
    @user = User.find_by_slug(params[:slug])
  end
  def reportForm
    @user = User.find_by_slug(params[:slug])

    Thread.new do
      mail = ...
    end
    @message = 'Thanks!'
  end
 

и в маршрутах:

 # User report form
  get "/user/:slug/report", to: "users#report"
 # Catch report form and action
  post "/user/:slug/report", to: 'users#reportForm'
 

И представление:

 <form method="POST" action="/user/<%= @user.slug %>/reportForm">
...
 

Но проблема в том, что когда я отправляю форму, действие reportForm не вызывается, и вместо этого только обновляется текущая страница с формой.

Что здесь не так?

Спасибо, ребята.

Комментарии:

1. Не уверен.. Но в соответствии с соглашением имя вашего метода не соответствует ему.. Измените reportForm в 3 местах (файл маршрута и имя действия и представление) на report_form и дайте мне знать..

2. Также, пожалуйста , используйте помощники формы Rails вместо того, чтобы создавать все маршруты и HTML вручную: guides.rubyonrails.org/form_helpers.html#nested-forms

3. @ArupRakshit к сожалению, это не помогло… Все то же самое. Даже если я изменю действие в форме на /usasfdsgasdhshs , оно останется тем же, приложение перенаправляется обратно на ту же страницу.

Ответ №1:

Помощники формы

Первое, что не так, это то, что вы не используете form helpers то, что предоставляет Rails — это проблема, потому что в итоге у вас возникнут мелкие проблемы, подобные той, которую вы получаете:

 #config/routes.rb
resources :users do
   get  :report #-> domain.com/users/:id/report
   post :reportForm #-> domain.com/users/:id/reportForm
end

#view
<%= form_tag user_reportForm_path(@user) do %>
   ...
<% end %>
 

Маршруты

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

Вы установили следующие маршруты:

 get "/user/:slug/report", to: "users#report"
post "/user/:slug/report", to: 'users#reportForm'
 

Это означает, что вам нужно отправить запрос domain.com/user/user_slug/report . Ваша форма отправляет URL на reportForm

Вы должны увидеть мои маршруты выше для решения этой проблемы

Но что еще более важно, вы должны прочитать nested resources :

 #config/routes.rb
resources :users do
   match :report, action: "reportForm", via: [:get, :post] #-> domain.com/users/:id/report
end
 

Slug

Наконец, вы пытаетесь использовать params[:slug] в своем контроллере

С ресурсоемкими маршрутами, которые вы должны использовать в Rails, вы будете проходить params[:id] большую часть времени. Это не должно быть проблемой (то, что содержится в params[:id] , может быть чем угодно).

Я бы настоятельно рекомендовал взглянуть на gem called friendly_id , что значительно упрощает включение slugs в ваше приложение:

 #app/models/user.rb
Class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: [:slugged, :finders]
end
 

Это позволит вам вызвать:

 #app/controllers/users_controller.rb
Class UsersController < ApplicationController
    def reportForm
       User.find params[:id] #-> will use either `id` or `slug`
    end
end