#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