2

次のコードを取ります。

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ハッシュを認識することは悪い習慣と見なされますか?もしそうなら、それが「ベストプラクティス」に従うようにどのようにリファクタリングしますか?

4

3 に答える 3

2

1 つのことは、パラメータをモデルに渡していじっている場合は、最初に .dup を実行する方法を採用することです。ルーティングがめちゃくちゃになった理由を突き止めようとして、どこかでモデルが params ハッシュからキーを削除しているのを見つけることほどイライラすることはありません。

また、何らかの理由で params ハッシュをモデルに渡す場合は、そのモデルに attr_accessible があることを確認してください。params はサニタイズされていないユーザー入力として扱う必要があります。

于 2011-03-09T14:23:25.390 に答える
1

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

@challenge = Challenge.find(params[:id])
if @challenge.update_attributes(params[:challenge])
  flash[:success] = "Challenge updated"
  redirect_to @challenge
else
  render :action=>:edit
end

これにより、値のハッシュが取り込まれ、送信する属性が自動的に設定されます (属性が attr_protected によって保護されている場合を除く)。

于 2011-03-09T13:56:21.080 に答える
0

私が正しく推測した場合、の場合が異なる場合に実行したい特定のアクションがacceptあり、acceptがfalseの場合、nilである必要がありshotsますchallenge_msg

これはいくつかの方法で行うことができます

ビューでそれを行うには、おそらくいくつかのjavascriptスクリプトを使用して、フィールドをクリアおよび非表示にし、shotsそれchallenge_msgに応じてフォームを送信できます

shotsまたは、コントローラーで、次のように設定しchallenge_msgてゼロにする必要があります。

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

@challenge.update_attributes(params[:challenge])

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

コードを改善するためのいくつかの提案、それが役立つことを願っています=)

于 2011-03-09T14:17:12.163 に答える