0

基本的に、アラートとアップデートの間には1対多の関係があります。多くの更新は1つのアラートに属します。今私の問題は、データベース内のレコードを更新できないことです。問題なく新しいレコードを作成できます。Railsロガーは実際のレコードをログに出力します。ログファイルからわかるように、@ new_alertは変更されたレコードを取得し、データベースに保存する必要があります。「アラートは正常に更新されました」と表示されますが、古いレコードが新しいレコードで更新されることはありません。AlertとUpdateの関係を削除すると、完全に機能します。AlertまたはUpdateモデルで何かを見逃したと思います。

alert_controller.rb..。

def update
@alert = Alert.find(params[:id])
    @new_alert = params[:alert]

    Rails.logger.debug "alert_params: #{@new_alert.inspect}"
    Rails.logger.debug "alert_db: #{@alert.inspect}"


respond_to do |format|
  if @alert.update_attributes(params[:alert])
    format.html { redirect_to @alert, notice: 'Alert was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @alert.errors, status: :unprocessable_entity }
  end
end 
end...

Alert.rb

class Alert < ActiveRecord::Base
  has_many :update  
  accepts_nested_attributes_for :update
end

Update.rb

class Update < ActiveRecord::Base
belongs_to :alert, :foreign_key => 'alert_id'  
end

(MySQL)アラートテーブル:

CREATE TABLE `alerts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `text` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `update_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)

(MySQL)テーブルを更新します:

CREATE TABLE `updates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `alert_id` int(11) DEFAULT NULL,
  `text` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)

ログ出力:

Started PUT "/alerts/4" for 127.0.0.1 at 2012-08-24 15:47:12 +0200
Processing by AlertsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"GHM+S34PV4o46SpZZm67+mM8Lu9eY/BiWGMjDpwju9c=", "alert"=>{"title"=>"afgaegafga56556", "text"=>"afgafgafgarg", "status_id"=>"2"}, "commit"=>"Update Alert", "id"=>"4"}
  [1m[35mAlert Load (0.5ms)[0m  SELECT `alerts`.* FROM `alerts` WHERE `alerts`.`id` = 4 LIMIT 1
alert_params: {"title"=>"afgaegafga56556", "text"=>"afgafgafgarg", "status_id"=>"2"}
alert_db: #<Alert id: 4, status_id: 2, date: "2012-08-22 20:00:19", text: "afgafgafgarg", title: "afgaegafga", update_id: 1>
  [1m[36m (0.0ms)[0m  [1mBEGIN[0m
  [1m[35mUpdate Load (0.5ms)[0m  SELECT `updates`.* FROM `updates` WHERE `updates`.`alert_id` = 4
  [1m[36m (0.5ms)[0m  [1mCOMMIT[0m
Redirected to http://localhost:3000/alerts/4
Completed 302 Found in 4ms (ActiveRecord: 1.5ms)

ありがとう!

4

1 に答える 1

2

has_many :update複数形である必要があります。has_many :updatesそうでない場合、関係はおそらく機能しません。

同じことが。にも当てはまりますaccepts_nested_attributes_for

また(重要ではありませんが、知っておくとよいでしょう)、関係名と一致する場合は外部キーを定義する必要はありません。したがってbelongs_to :alert, :foreign_key => 'alert_id'、とまったく同じbelongs_to :alertです。

于 2012-08-24T15:23:24.497 に答える