我对rails非常陌生,所以请原谅我有限的知识。
我有一个名为users的控制器。它有两种方法:new
和create
。
调用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#create
中UsersController
的代码如下:
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
答案 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
我不确定在哪里以及如何改变这种行为......