Rails 4: Запись в базе данных пуста и существует

#postgresql #post #ruby-on-rails-4 #commit

#postgresql #Публикация #ruby-on-rails-4 #фиксация

Вопрос:

Во-первых, проблема:

 Started POST "/weapons" for 127.0.0.1 at 2014-07-06 00:13:15  0200
Processing by WeaponsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Token-Raus-editiert", "art"=>"Schwert", "name"=>"Excalibur", "angriff"=>{"{:in=>1..6, :step=>1}"=>"5"}, "block"=>{"{:in=>1..6, :step=>1}"=>"2"}, "zustand"=>{"{:in=>1..100, :step=>1}"=>"100"}, "button"=>""}
   (0.2ms)  BEGIN
  Weapon Exists (0.4ms)  SELECT  1 AS one FROM "weapons"  WHERE "weapons"."name" IS NULL LIMIT 1
  Weapon Exists (0.8ms)  SELECT  1 AS one FROM "weapons"  WHERE "weapons"."id" IS NULL LIMIT 1
   (0.2ms)  ROLLBACK
Redirected to http://localhost:3000/weapons/new
Completed 302 Found in 13ms (ActiveRecord: 1.6ms)
  

он говорит мне, что оружие, которое я пытаюсь создать, уже существует. Что правильно, по его логике. Потому что он пытается зафиксировать «ничего», кроме идентификатора и creation_date. Итак, у меня есть только пустое поле в моей базе данных.

Это форма, которая отправляет запрос:

 <%= form_for @weapon  do %>
    <div class="WeaponGenerate">
      <table>
        <th><h1>Eine neue Waffe erschaffen</h1></th>
        <tr>
          <td>Welche Sorte Waffe soll es sein?</td>
          <td><%= select_tag :art, options_for_select(['Schwert', 'Axt', 'Bogen']) %></td>
        </tr>
        <tr>
          <td>Der Name für die Waffe soll sein?</td>
          <td><%= text_field_tag :name %></td>
        </tr>
        <tr>
          <td>Angriffswert</td>
          <td><%= number_field(:angriff,  in: 1..6, step: 1) %></td>
        </tr>
        <tr>
          <td>Blockwert</td>
          <td><%= number_field(:block,  in: 1..6, step: 1) %></td>
        </tr>
        <tr>
          <td>Zustand?</td>
          <td><%= number_field(:zustand,  in: 1..100, step: 1) %></td>
        </tr>
        <tr>
          <td></td>
          <td><%= button_tag('Waffe erschaffen') %></td>
      </table>
    </div>

<% end %>
  

и это контроллер:

 class WeaponsController < ApplicationController

  def index
    @weapon = Weapon.all
  end

  def new
    @weapon = Weapon.new
  end    

  def create
    @weapon = Weapon.new(weapon_params)
    if @weapon.save
      flash[:notice] = "Schwert erschaffen!"
      redirect_to(:action => 'show')
    else
      flash[:error] = "Leider gab es ein Problem!"
      redirect_to(:action => 'new')
    end
  end

  private
  def weapon_params
    params.require(:weapon).permit(:art, :name, :angriff, :block, :zustand) if params[:weapon]
  end
end
  

и, по крайней мере, модель с аннотациями:

 # == Schema Information
#
# Table name: weapons
#
#  id         :integer          not null, primary key
#  art        :string(255)
#  name       :string(255)
#  angriff    :integer
#  block      :integer
#  zustand    :float
#  kick       :hstore
#  created_at :datetime
#  updated_at :datetime
#

class Weapon < ActiveRecord::Base
  scope :bySword, lambda { where(:art => 'Schwert' ) }
  scope :byAxe, lambda { where(:art => 'Axt') }
  scope :byBow, lambda { where(:art => 'Bogen') }
  scope :sorted, lambda { order("weapons.art ASC") }
  scope :newest_first, lambda { order("weapons.created_at DESC")}
  scope :search, lambda {|query|
    where(["name LIKE ?", "%#{query}%"])}

    validates_presence_of :art, :name, :angriff, :block, :zustand
    validates_uniqueness_of :name, :id
end
  

Кто-нибудь видит мою ошибку? Я не. Итак, я надеюсь, что вы сможете мне помочь.

Комментарии:

1. Что произойдет, если вы удалите if params[:weapon] в weapon_params ?

2. Это подводит меня к интересной ошибке, которую я никогда раньше не видел: SystemStackError в WeaponsController#создать слишком глубокий уровень стека