0

アプリケーション ユーザーは、タイトル、投稿のコンテンツ、および投稿のカテゴリを含む新しい投稿を入力できます。したがって、新しい投稿を作成するには、いくつかのフィールドを持つ単純な html フォームを使用します。次の理由により、新しい投稿を作成するためのロジックをどこに置くべきかわかりません。

投稿 (または投稿コレクション) は、たとえば、さまざまなテーブルから構成されるオブジェクトです。

@posts = User.joins(entries: [{storage: :vote}, :category]) 
             .where("votes.count > ?", 0)
             .select("users.username AS username,
                      storages.id AS storage_id,
                      storages.title AS title, 
                      storages.content AS content, 
                      votes.count AS votes, 
                      categories.category_name AS category_name")
             .order("votes.count DESC")

したがって、ユーザーが新しい投稿アプリケーションを作成するときは、別のテーブルに新しいエントリを作成する必要があります。

1.エントリテーブルに新しいエントリを作成します。2.ストレージテーブル(id, user_id, category_id)
に新しいエントリを作成します。 3.投票テーブルに新しいエントリを作成します。(id, title, content, entry_id)
(id, count, storage_id)

投稿がモデルである状況ではresources: posts、投稿コントローラーで次のようなものを使用して新しい投稿newcreate作成できますが、投稿コントローラーも投稿モデルも必要ないこのような状況ではどうでしょうか? 質問は、新しい投稿を作成するためのロジックを配置するのに適した場所はどれですか? Q1

私の解決策は、ストレージコントローラーをresource: storages, :only => [:new, :create]作成してから、このコントローラーを新規作成して作成し、db にさまざまなテーブルを作成することですか? onlyストレージを個別に使用するのではなく、他のテーブルと組み合わせて使用​​するため、ここでは他の CRUD アクション (すべてまたは 1 つのストレージを表示するなど) のポイントが表示されないため、ここで強制しています。ビュー/ストレージから new.html.erb と create.html.erb を介して新しい投稿を作成できますか? Q2

別の解決策は、前に述べたように、「対応する」投稿モデルを持たない Post コントローラーを作成することです。:idここでは、投稿がないため、安らかなルート(CRUD)を使用できないと思いますか?
post 'posts/create/:title/:content/:category' => 'posts#create', :as => 'create_post'params[:title]のような安らかなルートparams[:content]を手動で作成することしかできませんparams[:category]Q3

私はレールに慣れていないので、怒鳴らないでください:D

4

2 に答える 2

0

いつでもネストされた属性の代わりにフォーム クラスを使用します。このパターンの (「3. フォーム オブジェクトの抽出」の章)

https://github.com/bbozo/simple_form_classをジェム化するのに十分な頻度でパターンを使用しましたが、おおまかに次のように使用されています: https://gist.github.com/bbozo/5036937、興味がある場合それを使用して、いくつかのドキュメントをプッシュします

編集:ほとんどの場合、フォームクラスルートに行く傾向がある理由は、ネストされた属性が最終的に私を噛むのに失敗したことがないためです。強力なパラメーターの処理が面倒になったか、バリデーターが複雑になりすぎたためです(永続化されている場合?他... )、または永続化ロジックを拡張して、コールバック地獄またはモデル内の再帰的保存に解決されるちょっとしたコツをサポートする必要があります (保存スパゲッティ トラブルの前/後)。

于 2013-11-12T09:20:34.997 に答える