2010-11-24 10 views
4

Djangoには、アクションが実行された後にユーザーに通知するメッセージフレームワークが存在します。例えば、views.pyからのようなものがあるかもしれません:メッセージは上記コントローラにハードコーディングする必要がありWebサイト/ Webアプリケーションのコントローラまたはモデルにメッセージが存在する必要がありますか?

flash[:notice] = 'Something is missing' 

if success: 
    messages.success(request, 'Update Successful') 
else: 
    messages.warning(request, 'Something is missing') 

私はRailsはと似た何かを持っていると信じて?

+0

"ハードコード化されましたか"?代わりに何がありますか?メッセージのI18N翻訳?それとも、他に何か覚えていますか? –

答えて

2

あなたの質問が分かっている場合は、コードに文字列値をハードコードする必要があるかどうかを尋ねてきます。コンパイルされた言語では、実際の文字列を入力する代わりに、文字列への参照を使用することがよくあります。 ala:

message.success(request, message_resource.success) 

これにより、コードを再コンパイルせずに文字列値を自由に変更でき、場合によってはパフォーマンス上のメリットがあります。

Pythonが動的なので、これは実際には必須ではありませんが、プロジェクトのサイズによっては有益かもしれません。

ソフトウェアがさまざまな言語を話す人々によって使用される状況を想像してください。コード内で必要な言語を検出して、message_resource.successなどの文字列を前記言語に初期化することができます。ここ

は簡単な例です:

german.py

# german language messages 
success = "Sie folgten!" 
failure = "Sie fallen aus!" 

english.py

#english language messages 
success = "You succeeded!" 
failure = "You fail!" 

main.py

# main 

# import english language 
message_resource = __import__('english'); 

print message_resource.success 
print message_resource.failure 

# import german language 
message_resource = __import__('german'); 

print message_resource.success 
print message_resource.failure 
2

Railsでは、任意の整列可能なオブジェクトをフラッシュに入れることができます。 したがって、ビューで行う方がよいです。コントローラのテキストと翻訳を置く

<% if flash[:notices] && flash[:notices][:missing] %> 
<div><%= t("Somethign missing") %></div> 
<% end %> 

は確かに少し醜い..です

+0

これはDRYではありませんか?モバイルブラウザのビューやXMLなどがある場合は、各ビューで同じテキストを繰り返す必要がありますか? – Zabba

+0

これを部分的に委譲してDRYを残しておきましょう。とにかく、これらの通知をXMLでレンダリングすることは間違いありません。 – buddhabrot

2

メッセージはイベントです。起こること。どちらがMVCの「コントローラ」の部分ですか? "方法"。

(Djangoは、この "ビュー機能" を呼び出します。)

モデルは、静的な最終的、永続的だ(主に)ものです。受動的。 "何"。

これはモデルに起こります。物事はコントローラによって開始されます。

メッセージは、人に提示するためにコントローラから送信されます。

モデルのメソッドが状態の変化に関する証拠や情報を提供する必要がある可能性があります。これは、モデルによって作成されるメッセージの例ではありません。モデルに突然変異/更新/状態変更を行うメソッドがある場合は、物事を2つに分割する必要があります。

"コントローラ"(Djangoビュー関数)は、モデルのAPIを使用して状態を変更し、その状態の変更に関する情報を収集する必要があります。

「コントローラ」(ビュー機能)はI18N変換を行い、メッセージを表示します。

1

一般的な例

  • モデル:それはデータのみに依存している場合、モデルに行くだろうis_missing()方法。

  • コントローラー:ビューのモデルからのマーシャリングデータ:missing = Suff.get_by_id(1).is_missing()

  • ビュー:<span>{$missing}<span>

しかし、場所を正確にあなたがそれらの線を描く常に最新の議論のためです。あなたの例では、flashsuccess、およびwarningは、の範囲を超えていると言います。はデータを提示する方法であり、一般的なデータプレゼンターであるため、ビューではより良いでしょう。

関連する問題