Rails 4 - 联系表单的路由操作

时间:2014-06-21 08:16:51

标签: ruby-on-rails ruby post get routes

我在控制器中有两个动作:

  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 个答案:

答案 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