【问题标题】:Rails - Redirecting after Form ErrorsRails - 表单错误后重定向
【发布时间】:2011-12-30 20:05:37
【问题描述】:

我对 Rails 很陌生,所以请原谅我的知识有限。

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

当调用users#new 时,会显示一个表单来注册我网站上的帐户。我为此设置了一个路由,使 URL /signup,如下所示:

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

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

用户控制器

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

UsersControllerusers#create 的代码如下所示:

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。如何获取它,如果注册失败,它会重定向到 /signup,并且仍然显示发生的错误?

更新: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

【问题讨论】:

  • 你能链接你的routes.rb文件吗?发生这种情况是因为映射到 POST users#create 的当前路由是 /users 如果你希望它是 /signup 你需要在你的 routes.rb 文件中编辑它,例如你应该删除创建和添加的路由一个新的,match "signup" =&gt; "users#create", :as =&gt; "signup", :method =&gt; :post
  • OK - 我想要的只是将用户数据发送到 create 方法(就像我一样),然后我希望它传回错误(如果有的话) 到 new 方法,因此它不应该更改 url
  • @AlexCoplan - 这不是它在 Rails 中通常的工作方式。通常,如果您有错误,您不会重定向 - 您只需重新显示同一页面......您提到的确切问题可能有一个看起来很糟糕的 url。
  • 我们通常“绕过它”的方式是为 get/post 使用相同的 url - 但将其路由到两个不同的控制器操作(取决于 http 动词) - 如所述@jpemberthy
  • 你需要get "signup" =&gt; "users#new", :as =&gt; "signup"post "signup" =&gt; "users#create"

标签: ruby-on-rails forms routing


【解决方案1】:

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

另外,考虑将注册和身份验证操作放在“帐户”(单一)资源上。 “用户”控制器/资源可能只用于后端管理界面。如果每个用户都有公共配置文件,请将它们放在“配置文件”资源中。将用户的仪表板放在“仪表板”控制器(不是资源)上。

【讨论】:

    【解决方案2】:

    我今天遇到了同样的问题,根据 Alex 和 Marian 的 cmets,我最终得到了这些变化:

    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 的新手,所以如果有任何副作用或问题,我欢迎 cmets。或者如果有更好的方法。

    【讨论】:

      【解决方案3】:

      路由确实是这样改正的,但是对应的控制器动作“users#new”的上下文,比如已经被动作初始化的变量,就丢失了。 所以我们最终处于一种不稳定的境地,我们既不在“新”环境中,也不在它之外…… 如何控制上下文是个问题?也许通过 ActiveModel::Validator

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 2020-02-13
        相关资源
        最近更新 更多