0

だから私はスコープルートとform_forでこの問題に遭遇しました:form_forとscopes、rails 3

すべてのメソッドのスコープを設定するだけではないので、GET / showを除いて、すべてを「/admin」の下に配置する必要があります。

したがって、私のroutes.rbには次のようなものがあります。

scope '/admin' do
  resources 'lessons', except: [:show]
end
get "lessons/:id" => "lessons#show", :as => "lesson"

rakeルートを実行すると、実際には、両方のバージョンのlesson_pathがメソッド、PUTとGETによってのみ異なる場合に必要なものが示されます。したがって、他の人が提供するソリューションは、次のようなことを行う場所です。

url = @lesson.persisted? ? lesson_path(@lesson) :  lessons_path
form_for @lesson, url: url do

lesson_path(@lesson)は、フォームを壊す/ adminプレフィックスのないGETパスを常に返すため、機能しません。

だから私が理解できないのは、/ adminで始まるルートを使用するように、Railsパスヘルパーでメソッドを指定できますか?それとも、これを達成するためのまったく異なる方法がありますか?私は、以下を変更することで、洞窟を作り、単純に曖昧さを解消できることを知っています。

get "lessons/:id" => "lessons#show", :as => "lesson"

get "lessons/:id" => "lessons#show", :as => "show_lesson"

しかし、この時点で、それが可能かどうか、もしそうなら「正しい」方法は何かを知りたいだけです。

4

1 に答える 1

0

この構文を探していると思います:

<%= form_for [:admin, @lesson] do |f| %>
  # form goes here
<% end %>

admin_lesson_pathこれにより、 if @lessonis persisted?、またはadmin_lessons_pathif it's notと呼ばれるポリモーフィック ルート ヘルパーが構築されます。admin_lesson_pathヘルパーにはオブジェクトが渡されるため@lesson、ルートは次のようになりますadmin/lessons/1admin_lessons_path生成し/admin/lessonsます。フォームは、レコードが永続化されているかどうかに応じて、POSTまたは使用するかどうかを認識します。PUT

次のように、ルート ファイルでルーティング ヘルプを定義できます。

 namespace :admin do
   resources :lessons
 end

このコントローラーに名前空間を設定することにより、いくつかの利点があります。それらの 1 つは、すべての管理者向けのものを単一の名前空間の背後に置き、その名前空間のすべてをベース コントローラーから継承できるようにすることです。

 module Admin
   class LessonsController < BaseController 

   end
 end

そして、ユーザーがそのコントローラーでアクションを実行できるかどうかを制限するためBaseControllerのロジックを ( として) 含めます。before_filter

これらの名前空間付きコントローラー内にすべての管理者用のものを配置することにより、すべての管理アクションを 1 つの場所に保持し、すべてのユーザー向けアクションを別の場所に保持します。「関心の分離」について聞いたことがあるなら、これはその良い例です。

于 2013-01-25T02:02:47.433 に答える