2016-04-25 4 views
0

私は、次のような効果を持っている私のルートを設定する方法がわからない:Ruby on Rails 4のカスタム編集と更新のアクションと同じカスタムルートを照合する方法は?

The image

私は今持っているもの:

get 'change_password' => 'staffs#edit_password', as: :change_staff_password 
patch 'change_password' => 'staffs#update_password', as: :change_staff_password 

しかし、それはエラーが発生します。ArgumentError: Invalid route name, already in use: 'change_staff_password_staff'

これは、パスが「change_password_staff」の名前がas:でないためです。しかし、わかりやすくするために、"change_staff_password"のスタッフが真ん中にいてほしいです。

私はmatchを見上げるとmatch ":controller/:action/:id"

が見つかりましたが、どのように私はパスが同じパス名を共有できるようにするには、このを設定する必要がありますか?

+0

ルートにアタッチされたas:valueを使用すると、Railsアプリケーションでurlを生成するメソッドを定義できます。これらはそれぞれのルートに固有のものでなければなりません。そうしないと、Railsアプリケーションはメソッドを呼び出すときにどのルートを生成しているのか分かりません。ルートのgetとpatchは同じルート名と一致する必要があります。なぜなら、最後に生成されるurlメソッドの名前を違うものに変更するだけです。 – hypern

答えて

1

私は答えを見つけた:

match 'change_password', to: 'staffs#edit_password', via: :get 
match 'change_password', to: 'staffs#update_password', via: :patch 

@hypern答えるために:私はルートが明確でシンプルにしたいです。

+0

これは将来のようないくつかの実装の後にコードの悪夢につながるでしょう。残念ながら、リソースを介して設定することもできます。 – Aleks

+0

私は新しいルートを 'resource:staff'の中に入れました。しかし、それは質問に無関係です、私はそれを入れていませんでした。しかし、あなたは良い点を作る! – donkey

0

これは、提案の回答に比べて別のアプローチである:

resource :staffs, only: :index do 
    get 'change_password' => "staffs#edit_password" 
    patch 'change_password' => "staffs#update_password" 
    end 

only: :indexは、それが必要とされていない場合にのみ、例として、あなたはそれを削除する必要があります。

関連する問題