2

私はチェックしようとしています-いくつかの(言語)属性が変更されているかどうか、そしてそれがいくつかの値と等しい場合は、それを他の適切な値に変更する必要があります。

これが私のコードです:

編集

    def update
@website = Website.find(params[:id])
@website.language = params[:website][:language]
if @website.language_changed?
  if params[:website][:language] == "Automatic (by user's browser language)"
    @website.language = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
  end
end
respond_to do |format|
 if @website.save
   format.html { redirect_to @website, 
  notice: 'Note: code has been updated. Please replace the code you have on your website with the code below. Only then changes will take effect.' }
   end
  end
end

私のフォーム:

  <%= f.label "Website category"%>
  <%= f.select :category, options_for_select([
      "--- please select ---",
      "Banking",
      "Computers]) %>
  <%= f.label "Language preferences"%>
  <%= f.select :language, options_for_select([
       "--- please select ---",  
       "Automatic (by user's browser language)",
        "Arabic",
        "Chinese"]) %>

そして、カテゴリを変更するときは、言語をデフォルトに変更します。どうすればこれを防ぐことができますか?

エラーが発生します:

   undefined method `updated?' for "--- please select ---":String

私が間違っているのは何ですか?

4

2 に答える 2

5

コンソールからこれを試しましたが、のような一括属性更新を行ったときにActiveRecordが変更を追跡していないよう@website.attributes = params[:website]です。次のようなことをする方が簡単かもしれませんif @website.language != params[:website][:language](もちろん、更新を後でどこかに移動します)。少し醜いですが、うまくいくでしょう。もちろん、大量の更新からの変更を追跡するためにモデルを拡張することをいつでも検討できます。

フィールドの変更について-選択リストが正しい値に初期化されていないようです。の値@website.categoryが「foo」の場合、このページが読み込まれるときに、選択リストで「foo」が選択されている必要があります。それは起こっていないようです。そのため、フォームを送信して一括属性の更新を行うと、デフォルトで選択されているリスト項目にカテゴリ属性が更新されます。

于 2012-10-04T14:49:17.900 に答える
0

@website.language_changed?方法です、あなたはhttp://railscasts.com/episodes/109-tracking-attribute-changesを見ることができます

def update
  @website = Website.find(params[:id])

  if params[:website][:language] == "Automatic (by user's browser language)" &&  @website.language != params[:website][:language]
    params[:website][:language] = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
  end
  if @website.update_attributes(params[:website])
  end

end
于 2012-10-04T14:17:26.830 に答える