所以我在保存表单数据方面遇到了麻烦。任何帮助都会很明显 提交表单时没有收到任何错误,但在数据库中,没有存储任何内容 我是新的铁路
users_controller
class UsersController < ApplicationController
def new
@user= User.new
end
def create
@user = User.new(params[:User])
if @user.save
flash[:notice]= "you signed up successfully"
flash[:color]= "valid"
else
flash[:notice]= "failed"
flash[:color]="invalid"
end
render "new"
end
end
new.html.erb
<% page_title="Signup" %>
<div class="Sign_Form">
<h1>Sign up</h1>
<%= form_for(:user, :url => {:controller => 'users', :action => 'create'}) do |f| %>
<p> Username:</br> <%= f.text_field :username %> </p>
<p> Email:</br> <%= f.text_field :email %> </p>
<p> Password:</br> <%= f.password_field :password %></p>
<p> Password Confirmation:</br> <%= f.password_field :password_confirmation %> </p>
<%= f.submit :Signup %>
<% end %>
<% if @user.errors.any? %>
<ul class="Signup_Errors">
<% for message_error in @user.errors.full_messages %>
<li>* <%= message_error %></li>
<% end %>
</ul>
<% end %>
</div>
app / models / user.rb中的
class User < ActiveRecord::Base
attr_accessor :password
EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
validates :email, :presence => true, :uniqueness => true #:format => EMAIL_REGEX
validates :password, :presence =>true #:confirmation => true #password_confirmation attr
validates_length_of :password, :in => 6..20, :on => :create
end
答案 0 :(得分:2)
在users_controller,create方法中,您正在使用
@user = User.new(params[:User])
用以下代码替换它,希望它能正常工作。
@user = User.new(params[:user])
而且,如果你使用的是轨道,也可以使用强大的参数。如下所示。
def create
@user = User.new(user_params)
if @user.save
flash[:notice]= "you signed up successfully"
flash[:color]= "valid"
else
flash[:notice]= "failed"
flash[:color]="invalid"
end
render "new"
end
private
def user_params
params.require(:user).permit(:username, :account, :email, :password, :password_confirmation)
end
如果仍然不起作用,请显示您的日志。
答案 1 :(得分:1)
如果您使用的是Rails 4,则需要使用strong parameters将要分配给模型的参数列入白名单。
这在Rails 4中变得不可选,以防止大规模分配漏洞,恶意用户可以在Egor Homakovs公开Github攻击之后将任何属性分配给模型。
另请注意,Ruby区分大小写。这也适用于散列键:
irb(main):003:0> hash = { a: 1 }
=> {:a=>1}
irb(main):004:0> hash[:A]
=> nil
这就是您为什么要User.new(params[:User])
实际做User.new(nil)
这是您的控制器的更正版本
class UsersController < ApplicationController
def new
@user= User.new
end
def create
@user = User.new(params[:User])
if @user.save
flash[:notice]= "you signed up successfully"
flash[:color]= "valid"
# You should redirect instead of rendering the form again
redirect_to @user # or redirect_to root_path
else
flash[:notice]= "failed"
flash[:color]="invalid"
render "new" # Needs to be inside the "else" statement
# Otherwise you will get a double render error
end
end
def user_params
params.require(:user)
.allow(:username, :email, :password, :password_confirmation)
end
end
您还可以将form_for简化为
<%= form_for(:user) do |f| %>
Rails会按照惯例将表单路由到UserController#create
。
此外,您应该使用<label>
标签进行访问,因为它们可以帮助使用屏幕阅读器等辅助技术的人找到正确的输入。
通过使用内置的label
辅助轨道将设置for
属性,您可以使用内置I18n功能的Rails翻译标签文本。
<% page_title="Signup" %>
<div class="Sign_Form">
<h1>Sign up</h1>
<%= form_for(:user) do |f| %>
<div class="row">
<%= f.label :username %>:</br>
<%= f.text_field :username %>
</div>
<div class="row">
<%= f.label :email %>:</br>
<%= f.text_field :email %>
</div>
<div class="row">
<%= f.label :password %>:</br>
<%= f.password_field :password %>
</div>
<%= f.submit :Signup %>
<% end %>
<% if @user.errors.any? %>
<ul class="Signup_Errors">
<%# for loops are almost never used in ruby. %>
<%# .each is the idiomatically correct way %>
<% @user.errors.full_messages.each do |message_error| %>
<li>* <%= message_error %></li>
<% end %>
</ul>
<% end %>
</div>