0

これが私が解決しようとしてきた問題ですが、完全なハックのように感じられない方法は見つかりませんでした。Warehouse と StateCity の 2 つのオブジェクトがあります。Warehouse オブジェクトには、StateCity オブジェクト ( state_city_id ) への外部キーがあります。

ユーザーが倉庫を作成するときに、都道府県と市区町村を入力できるようにしたいと考えています。現在、彼らはそうすることができます。送信された State と City のパラメーターを確認し、対応する ActiveRecord オブジェクトを作成または検索します。彼らが私のビューでウェアハウスを表示しようとすると、ヘルパーを使用して StateCity オブジェクトから State/City を抽出する (存在する場合) か、モデルにメソッドを追加して以下のように同じ機能を実行するかの間で揺れ動きました。

def show_state( warehouse )
  if warehouse.state_city.nil? == false
    return warehouse.state_city.state
  end
  return ""
end

def show_city( warehouse )
  if warehouse.state_city.nil? == false
    return warehouse.state_city.city
  end
  return ""
 end

残念ながら、オブジェクトの作成とオブジェクトの表示に 1 つを使用する必要があるため、ヘルパー メソッドや追加の関数を使用してモデルを肥大化することはあまり自然ではないようです。

Warehouse-StateCity の問題を解決するためのより良い方法について誰かアドバイスがあるかどうか疑問に思っていました。どんな助けでも大歓迎です。

4

1 に答える 1

1

まず最初に、この種のステートメントを次のように書くことができます。

return warehouse.state_city.city unless warehouse.state_city.nil?

しかし、それはあなたが探している答えではないと確信しています。

ウェアハウスを常にStateCityに関連付ける必要があると想定しています。その場合、ウェアハウスが作成され、そのロジックがコントローラーによって処理され、ウェアハウスモデルによって検証されるたびに、ユーザーは常に州と都市を選択する必要があります。

すべての検証が正しい場合、Warehouseモデルのshowアクションで実行する必要があるのは、WarehouseからStateCityオブジェクトをフェッチすることだけです。

@state_city = warehouse.state_city

そして、ビューでフィールド@state_city.stateとにアクセスするだけです@state_city.city。これらのStateCityオブジェクトをどのように作成しているかは完全にはわかりませんが、それはあなたが物事をどのようにやりたいかとほぼ同じように聞こえます。

state_cityがnilの場合、表示する内容に応じてさまざまな方法で処理できます。それでもウェアハウスショービューを表示したい場合は、ビューで次のようなチェックを行うことができます

<% if @state_city %>
  # Do something with the state city like display the state and city?
<% end %>

たとえば、州の都市を更新するようにユーザーに指示する場合は、コントローラーから次のようにして処理します。

unless @state_city
  redirect_to "your edit action" and return
end

それが行うことは、state_cityがnullであるかどうかをチェックし、ユーザーを必要なアクションにリダイレクトすることです。

于 2012-12-13T03:24:17.277 に答える