Rails - 在表单错误后重定向

时间:2011-11-16 21:33:36

标签: ruby-on-rails forms routing

我对rails非常陌生,所以请原谅我有限的知识。

我有一个名为users的控制器。它有两种方法:newcreate

调用users#new时,系统会显示一个表单以在我的网站上注册一个帐户。我已经为此设置了一个路由,用于制作URL /注册,如下所示:

match "signup" => "users#new", :as => "signup"

当用户导航到/ signup时,我创建一个新的user实例变量并向其显示表单,如下所示:

UsersController

def new
    @user = User.new
end

新视图

<%= form_for @user do |f| %>
<!-- Form code here... -->
<!-- Then at the end: -->
<%= f.submit :value => 'Sign Up' %>
<% end %>

当用户提交此表单时,它会将数据发送到users#create

users#createUsersController的代码如下:

def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to root_url, :notice => 'Signed Up!'
    else
      render "new"
    end
end

if / else语句用于检查rails是否能够创建我的新用户。如果是,它重定向到索引没问题。

如果无法创建用户,则会呈现我的新视图,并显示错误。

但是,它然后给我们的URL是/ users,因为当它提交表单时它会提交给/ users。如果注册失败,我怎么能得到它,它会重定向到/注册,仍然显示发生的错误?

更新:routes.rb

Flightdb::Application.routes.draw do
  get "users/new"
  get "home/about"
  get "home/index"
  root :to => 'home#index'
  match 'about' => 'home#about'
  match "signup" => "users#new", :as => "signup"
  resources :users
end

3 个答案:

答案 0 :(得分:0)

你不想听到的答案是,这通常都没有完成。无论哪种方式,URL的语义都不理想。 / new意味着一种全新的形式......但是有错误的形式是一种“部分创建”的用户。在任何一种情况下,用户都不需要使用URL,因此不会丢失任何功能。

另外,请考虑将注册和身份验证操作放在“帐户”(单数)资源上。 '用户'控制器/资源应该只适用于后端管理界面。如果每个用户都有公开的评论,请将它们放在“个人资料”资源上。将用户的仪表板放在“仪表板”控制器(不是资源)上。

答案 1 :(得分:0)

我今天遇到了同样的问题,基于Alex和Marian的评论,我最终得到了这些变化:

1)在表单视图中:

<%= form_for @user, url: signup_path do |f| %>

2)在routes.rb中:

get "signup" => "users#new", :as => "signup"
post "signup" => "users#create"
resources :users
root :to => "home#index"

我是RoR的新手,所以如果有任何副作用或问题我欢迎发表评论。或者如果有更好的方法。

答案 2 :(得分:0)

路径确实以这种方式纠正,但相应的控制器操作“users#new”的上下文(例如已由操作初始化的变量)将丢失。 所以我们最终处于一种不稳定的状态,我们既不处于“新”环境中,也不处于“新”环境之外...... 如何控制上下文是个问题?也许通过ActiveModel :: Validator

我不确定在哪里以及如何改变这种行为......