Ruby on rails 登录或注册(Ruby on rails)

Ruby on rails 登录或注册(Ruby on rails),ruby-on-rails,ruby,validation,registration,login-control,Ruby On Rails,Ruby,Validation,Registration,Login Control,我正在开发一个RubyonRails应用程序(2.3.x),我想制作一个表单,让用户登录或注册。我想用同样的方式来做。我有一个JS函数,可以替换如下表单元素: <% form_for @user do |f| %> <div id="form"> <%= f.label :name, "Name" %> <%= f.text_field :name %> <%= f.label :email, "E-mail" %&

我正在开发一个RubyonRails应用程序(2.3.x),我想制作一个表单,让用户登录或注册。我想用同样的方式来做。我有一个JS函数,可以替换如下表单元素:

<% form_for @user do |f| %>
<div id="form">
    <%= f.label :name, "Name" %>
    <%= f.text_field :name %>

    <%= f.label :email, "E-mail" %>
    <%= f.text_field :email %>

    <%= f.label :password, "Password" %>
    <%= f.password_field :password %>

    <%= f.label :password_confirmation, "Password confirmation" %>
    <%= f.password_field :password_confirmation %>

    <%= link_to "I do have an account, "#", :id => "changeForm"%>
    <%= f.submit "Register" %>
</div>
<% end %>
#if password_conf or the name are present the user has tried to register...
if params[:user][:password_confirmation].present? || params[:user][:name].present?
   #so we'll try to save the user
   if @user.save
     #if the user is saved authenticate the user
     current_session.user = User.authenticate(params[:user])
     #if the user is logged in?
     if current_session.user.present?
       flash[:notice] = "succesvully logged
       redirect_to some_routes_path
     else
       #not logged in...
       flash[:notice] = "Not logged in"  
       render :action => "new"            
     end
   else
     #user not saved
     render :action => "new"
   end
 else
   #So if the params[:user][:password_confirmation] or [:user][:name] weren't present we geuss the user wants to login...
   current_session.user = User.authenticate(params[:user])
     #are we logged_in?
     if current_session.user.present?
       flash[:notice] = "Succesvully logged in"
       redirect_to some_routes_path
     else
       #errors toevoegen    
       @user.errors.add(:email, "The combination of email/password isn't valid")
       @user.errors.add(:password," ")
       render :action => "new"
     end
 end
end
登入表格:

<% form_for @user do |f| %>
<div id="form">
    <%= f.label :email, "E-mail" %>
    <%= f.text_field :email %>

    <%= f.label :password, "Password" %>
    <%= f.password_field :password %>

    <%= link_to "I don't have an account, "#", :id => "changeForm"%>
    <%= f.submit "Login" %>
</div>
<% end %>
如果没有验证,这(imho脏代码,不应该在控制器中)可以工作。但是我想使用validates\u presence\u方法,我不想当面抨击“约定优于配置”

所以我尝试过的另一件事是在表单中添加一个隐藏字段:

    #login form
    <%= f.hidden_field :login, :value => true %>
    # and ofcourse set it to false if we want to register.
但这不起作用,因为我无法访问参数。并且登录不是用户对象的属性。但我认为,如果用户想要登录,我可以通过这种方式验证电子邮件和密码参数。以及所有其他属性(如果用户要注册)

所以我所能想到的并不是我想要的那样。所以我的主要目标是:

1使用用户模型中的验证方法进行登录/注册的表格。因此,如果我们想登录,但不填写任何信息=>请给出验证错误。如果用户想要登录,但电子邮件/密码组合不匹配,请输入“@user.errors.add”(:email,“在数据库中找不到该组合…”)。用户注册也是如此


提前谢谢

您应该将每个表单指向相应的控制器操作:

# Registration form
<% form_for @user, :url => users_path do |f| %>
...
<% end %>

# Login form, non-RESTful action
<% form_for @user, :url => login_users_path do |f| %>
...
<% end %>

您应该将每个表单指向相应的控制器操作:

# Registration form
<% form_for @user, :url => users_path do |f| %>
...
<% end %>

# Login form, non-RESTful action
<% form_for @user, :url => login_users_path do |f| %>
...
<% end %>

你为什么要用同样的路线做这件事?我同意Stef的观点。您可以让用户在同一页面上登录或注册,但让表单提交给不同的控制器或操作。为什么要使用相同的路径进行此操作?我同意Stef。您可以让用户登录或在同一页面上注册,但让表单提交给不同的控制器或操作。回答不错,但将来请指导用户使用更简单的路由帮助程序,例如
会话\u路径
,他们必须在
配置/routes.rb
中自行生成。建议不错。更新了我的答案。谢谢。结果证明这是有效的!老兄,我现在觉得自己很笨。。。但是编码8小时后,您开始出错…回答得不错,但将来请指导用户使用更简单的路由帮助程序,例如
会话\u path
,他们必须在
配置/routes.rb
中生成这些帮助程序。建议不错。更新了我的答案。谢谢。结果证明这是有效的!老兄,我现在觉得自己很笨。。。但编码8小时后,你开始出错。。。
# Registration form
<% form_for @user, :url => users_path do |f| %>
...
<% end %>

# Login form, non-RESTful action
<% form_for @user, :url => login_users_path do |f| %>
...
<% end %>
# Use SessionsController (Sessions#Create) to create a new user session
<% form_for @user, :url => sessions_path do |f| %>
...
<% end %>