2012-02-25 7 views
0

これは私を悩ましています。何らかの理由で、dbは自分のパラメータではなくnilフィールドでレコードを保存しています。 ActiveRecordがなぜ私のパラメータを使用していないのか誰にでも分かりますか?Rails ActiveRecordパラメータを無視してNilデータを保存します

デシベル移行:

class CreateRoutes < ActiveRecord::Migration 
    def change 
    create_table :routes do |t| 
     t.integer :user_id 
     t.string :start_address 
     t.string :end_address 
     t.text :waypoints 
     t.text :schedule 
     t.integer :duration 

     t.timestamps 
    end 
    add_index :routes, :user_id 
    end 
end 

route.rb:

class Route < ActiveRecord::Base 
    attr_accessor :start_address, :end_address, :waypoints, :schedule, :duration 
    belongs_to :user 
    #serialize :waypoints, :schedule 

    validates :user_id, presence: true 
    validates :start_address, presence: true 
    validates :end_address, presence: true 
    validates :schedule, presence: true 
    validates :duration, presence: true, numericality: { only_integer: true, greater_than: 0 } 

end 

routes_controller.rb:

class RoutesController < ApplicationController 
    . 
    . 
    . 
    def create 
    logger.debug "\n\n*** #{params[:route]} ***" 

    @route = current_user.routes.build(params[:route]) 

    logger.debug "*** The route is #{@route.inspect} ***\n\n" 

    if @route.save 
     flash[:success] = "Route saved!" 
     redirect_to user_path(current_user) 
    else 
     render 'new' 
    end 
    end 
    . 
    . 
    . 
end 

ロガー出力:

*** {"start_address"=>"123 Sample St.", "end_address"=>"321 Elpmas St.", "waypoints"=>"None", "schedule"=>"Mondays", "duration"=>"15"} *** 
*** The route is #<Route id: nil, user_id: 1, start_address: nil, end_address: nil, waypoints: nil, schedule: nil, duration: nil, created_at: nil, updated_at: nil> *** 
+1

なぜDBプロパティのattr_accessorsを定義していますか? –

+0

私はこのデータを自分のコードの他の部分から読み書き可能にしたいと思っています。 Attr_accessorは、特定の読み取り/書き込みメソッドを記述するよりも簡単に思えました。これがレールに慣用的であるかどうかはわかりません。私のスタイルの多くは、Hartlのチュートリアルに基づいています。 – rringler

+0

DBプロパティには、すでにActiveRecordによって提供されているアクセサがあります。おそらくあなたはそれらを上書きしているでしょう。 –

答えて

3

attr_accessorは、ActiveRecordによって生成されたアクセサーを上書きし、DBに残らないようにします。つまり、ActiveRecordというメタプログラミングされた魔法の代わりに、古いRubyのプロパティ/メンバーと同じです。

DBプロパティ(永続プロパティ)にはattr_accessibleのようなものがあります。

+0

ありがとうございます。私のコードはこれらのプロパティに対して 'attr_accessor'を指定して読み取り専用にしています。これを 'attr_accessible'に変更すると、私の書き込みの問題は(期待どおり)解決されます。初心者の方はありがとうございます。 – rringler