Ruby on rails构成的数据无法保存

时间:2015-08-19 12:05:01

标签: mysql ruby-on-rails ruby

所以我在保存表单数据方面遇到了麻烦。任何帮助都会很明显 提交表单时没有收到任何错误,但在数据库中,没有存储任何内容 我是新的铁路

  

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

2 个答案:

答案 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>