2011-03-09 10 views
2

次のコードを取りますモデルはparamsハッシュを認識しています - Railsのアンチパターン?

class ChallengesController < ApplicationController 

    def update 
    @challenge = Challenge.find(params[:id]) 
    @challenge.update!(params[:challenge]) # never an expected error, show error page and give hoptoad notification 

    respond_to do |format| 
     format.html { redirect_to :action => 'index' } 
    end 
    end 

end 

class Challenge < ActiveRecord::Base 

    def update!(options) 
    if options[:accept] == '1' then 
     self.accepted = true 
     self.response_at = Time.now   
     self.shots = options[:shots] unless options[:shots].blank?    
     self.challengee_msg = options[:challengee_msg] unless options[:challengee_msg].blank? 
    else 
     self.accepted = false 
     self.response_at = Time.now 
    end 
    end 

end 

はそれに渡されるparamsハッシュを認識するモデルの悪い習慣と考えられますか?もしそうなら、あなたはどのようにリファクタリングして「ベストプラクティス」に従うでしょうか?

答えて

1

いいえ、これは受け入れられたパターンです。これは通常、active_recordメソッドupdate_attributesが組み込まれているので、このように使用されます。

値のハッシュに取ると自動的に(彼らはattr_protectedにより保護されていない限り)あなたが送る属性を設定します
@challenge = Challenge.find(params[:id]) 
if @challenge.update_attributes(params[:challenge]) 
    flash[:success] = "Challenge updated" 
    redirect_to @challenge 
else 
    render :action=>:edit 
end 

+0

明確にするために、update_attributesを実装する必要はありません。このメソッドはすでに存在しています。 –

0

私は正しく推測した場合、あなたはあなたがacceptのために異なる場合があるとき実行したい特定のアクションを持っている、と偽の受け入れ場合、shotschallenge_msg

はnilこれは、いくつかの方法で行うことができますする必要がありますおそらくいくつかのJavaScriptのスクリプトで、あなたはクリアして隠しフィールドをshotschallenge_msgのために、それに応じ

またはコントローラでフォームを送信することができ、あなたがshots Aを設定する必要があります、ビューでそれを行うには

以下のような何かを実行して、nilにND challenge_msg

if params[:challenge][:accepted] == "0" 
    params[:challenge][:shots]   = nil 
    params[:challenge][:challenge_msg] = nil 
end 

@challenge.update_attributes(params[:challenge]) 

またはモデルでは、あなたはそれがaccept場合、保存する前にnilにshotschallenge_msgを設定するbefore_saveのようなコールバックを使用して行うことができます

が偽

だけでいくつかの提案へコードを改善して助けてください=)

2

一つのことは、モデルにパラメータを渡してそれを使っている場合、最初に.dupを実行するという慣行を採用することです。なぜ、ルーティングが乱れているのか、どこかのモデルを見つけるためだけにparamsハッシュのキーを削除していたのが分かりません。

また、何らかの理由でモデルにparamsハッシュを渡す場合は、必ずそのモデルにattr_accessibleを設定してください。 paramsをunsanitizedユーザー入力として扱う必要があります。

関連する問題