我在控制器中有两个动作:
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
,而是仅使用表单刷新当前页面。
这里有什么问题?
谢谢你们。
答案 0 :(得分:1)
表单助手
首先,你错误的是你没有使用Rails提供的form helpers
- 这是一个问题,因为你最终会遇到像你这样的问题。 #39;重新接收:
#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
。您的表单会将网址发送到reportForm
...
您应该看到上面的路线以解决此问题
但更重要的是,您应该阅读nested resources
:
#config/routes.rb
resources :users do
match :report, action: "reportForm", via: [:get, :post] #-> domain.com/users/:id/report
end
<强>蛞蝓强>
最后,您尝试在控制器中使用params[:slug]
使用应该在Rails中使用的资源丰富的路由,您将在大多数时间内通过params[:id]
。这应该不是问题(params[:id]
中包含的内容可以是任何内容)。
我强烈建议您查看一个名为friendly_id
的gem,它会使您的应用程序中包含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