0

私は 2 つのモデルを持っています。それらを更新しているときにエラーが発生します。ネストされた属性を使用しました。

 class Channel < ActiveRecord::Base
    self.primary_key = 'id'

    has_many :channel_mappings , primary_key: 'channel_name', foreign_key: 'channel_name'

    attr_accessible :channel_name, :channel_mappings_attributes

    validates_presence_of :channel_name

    accepts_nested_attributes_for :channel_mappings, :allow_destroy => true
end

2ndモデル

class ChannelMapping < ActiveRecord::Base
  self.primary_key = 'src_channel'

  belongs_to :channel, primary_key: 'channel_name', foreign_key: 'channel_name'

  attr_accessible :src_channel, :channel_name , :src_file_type 
end

Update メソッド

def update
        @channel = Channel.find(params[:id])

        if @channel.update_attributes(params[:channel])
            redirect_to @channel, notice: 'Channel was successfully updated.'
        else
            render action: 'edit'
        end
    end

エラー

  Type: ActiveRecord::RecordNotFound
      Message:  Couldn't find ChannelMapping with ID=ANY NAME for Channel with ID=2

主キーの上書きに関係していることはわかっています。どんな助けも役に立ちます

デシベル/schema.rb

create_table "channels", :force => true do |t|
    t.text    "channel_name",                                  :null => false
    t.string  "internal_flag",                  :limit => nil
    t.string  "exception_flag",                 :limit => nil
  end

create_table "channel_mappings", :id => false, :force => true do |t|
    t.text    "src_channel",   :null => false
    t.text    "channel_name",  :null => false
  end
4

2 に答える 2

0

あなたは試すことができます-@channel.attributes = params[:channel]代わりに@channel.update_attributes(params[:channel])

これにより、すべての属性も設定されますが、保存はされません。

次に、呼び出すことができます-

@channel.save

これにより、属性が保存されます。

エラーは、更新を元に戻すのではなく、レコードが見つからないようです。

最初にエラー ログを確認し、必要に応じて、何も機能しない場合はここに投稿します。

if else 条件を次のように使用することをお勧めします。

if @channel.save
#record saved
else
#error in save
end

そうすれば、それがどこに向かっているのかを知ることができます。

于 2013-03-21T12:13:54.923 に答える
0

Channel.rb の最初の行では、主キーを 'id' に設定しています。では、なぜアソシエーションで primary_key='channel_name' を指定しているのですか? それは間違っているようです。

また、db/schema.rb にあるチャンネル テーブルの定義を確認することも役に立ちます。

追加情報後に更新

あなたの要点では、パラメーターに channel_mappings_attributes に id キーが含まれていることがわかります。ただし、あなたの schema.rb は、channel_mappings に ID がないことを示しています。それはあなたが修正する必要がある最初のものです。

于 2013-03-21T12:50:31.927 に答える