Rails记录不保存

Mic*_*ton 2 rake ruby-on-rails

在尝试保存记录时,我有一个非常非冗长的错误(使用Rails 4,Ruby 2.0.0).

这就是发生的事情.

2.0.0p0 :001 > Startup
 => Startup(id: integer, name: string, url: string, founded: date, mal: boolean,
            created_at: datetime, updated_at: datetime, creator: string, 
            description: text, category: text) 

2.0.0p0 :002 > @s = Startup.new(:name => "New Startup", 
                                :url =>  "http://newstartup.com", 
                                :founded => Date.today,
                                :mal => false, 
                                :creator => "127.0.0.1", 
                                :description => "This is a description", 
                                :category => ["","Sports"])
 => #<Startup id: nil, name: "New Startup", url: "http://newstartup.com", founded: "2013-04-25", mal: false, created_at: nil, updated_at: nil, creator: "127.0.0.1", description: "This is a description", category: ["", "Sports"]> 

2.0.0p0 :003 > @s.save
   (0.2ms)  BEGIN
   (0.3ms)  ROLLBACK
 => false 
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

class Startup < ActiveRecord::Base
  before_validation(:on => :create) do
    self.mal = false
  end

  attr_accessible :name, :url, :description, :category, :creator, :mal, :founded
end
Run Code Online (Sandbox Code Playgroud)

模式:

create_table "startups", force: true do |t|
  t.string   "name"
  t.string   "url"
  t.date     "founded"
  t.boolean  "mal"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "creator"
  t.text     "description"
  t.text     "category"
end
Run Code Online (Sandbox Code Playgroud)

和控制器:

class StartupsController < ApplicationController
  before_action :set_startup, only: [:show, :edit, :update, :destroy]
  before_create :set_creator

  # GET /startups
  # GET /startups.json
  def index
    @startups = Startup.all
  end

  def land
    @startup = Startup.new
    @resource = User.new
    @devise_mapping = Devise.mappings[:user]
  end

  # GET /startups/1
  # GET /startups/1.json
  def show
  end

  # GET /startups/new
  def new
    @startup = Startup.new
  end

  # GET /startups/1/edit
  def edit
  end

  # POST /startups
  # POST /startups.json
  def create
    @startup = Startup.new(startup_params)

    respond_to do |format|
      if @startup.save
        format.html { redirect_to @startup, notice: 'Startup was successfully created.' }
        format.json { render action: 'show', status: :created, location: @startup }
      else
        format.html { render action: 'new' }
        format.json { render json: @startup.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /startups/1
  # PATCH/PUT /startups/1.json
  def update
    respond_to do |format|
      if @startup.update(startup_params)
        format.html { redirect_to @startup, notice: 'Startup was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @startup.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /startups/1
  # DELETE /startups/1.json
  def destroy
    @startup.destroy
    respond_to do |format|
      format.html { redirect_to startups_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_startup
      @startup = Startup.find(params[:id])
    end

    def set_creator
      @startup.creator = request.remote_ip
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def startup_params
      params.require(:startup).permit(:name, :url, :added, :founded, :mal, :creator, :description, {:category => []})
    end
end
Run Code Online (Sandbox Code Playgroud)

当我想Startup.category从字符串切换到字符串列表时,我才开始遇到这个问题.

我做错了什么或在哪里可以找到更多错误信息?

Jef*_*Jef 10

whateverModel.save不会引发任何异常但返回true(模型已保存)或false.如果你打电话save,create或者update_attributes(没有爆炸)或valid?你的模型将从errors控制台公开一个属性:

puts @s.errors.messages.inspect
Run Code Online (Sandbox Code Playgroud)

更新:

您的最后一个(也是唯一一个)表达式before_validation正在返回false,这意味着该事务将被中止,请尝试:

self.mal=false
true
Run Code Online (Sandbox Code Playgroud)