

ruby on railsで  
同じhtmlファイルにひとつのactionしか呼び出されなくて困ってます。

[code]

    # routes.rb
    match 'users' => 'users#hoge',:via => :post 
    match 'users' => 'users#foo', :via => :post
    
    # users view
    form_for @users, :url => {:action => 'hoge'} do |f|
      f.email
      f.hoge
     .
     .
     .      
      submit  
     end 
    
    form_for @users, :url => {:action => 'foo'} do |f|
      f.email
      f.hoge
     .
     .
     .      
      submit  
    end   
    
[/code]

こう指定してみましたが呼ばれませんでした。  
これだとhoge actionしか呼ばれなかったです。  
同じページにpostアクションを２つつけることはできないでしょうか？


CC BY-SA 3.0
2015-03-18T09:12:30.487
8061
2015-03-18T19:38:07.470
2015-03-18T19:19:02.820
85
8277
question
ruby-on-rails
ruby on railsで同じページに複数のpost情報を作る


## 期待通りの動作にならない理由

> <http://railsguides.jp/routing.html>
>
> Railsのルーティングは、ルーティングファイルの「上からの記載順に」マッチします。このため、たとえばresources
> :photosというルーティングがget
> 'photos/poll'よりも前の行にあれば、resources行のshowアクションがget行の記述よりも優先されますので、get行のルーティングは有効になりません。

`rake routes`などでルーティングを確認すると。２つの定義はどちらも  
`POST /users(.:format)`となっていて、衝突しているためです。

## 解決の一例

こういった記述が保守的な観点から好ましいかどうかは別として。

[code]

    match 'users/hoge' => 'users#hoge',:via => :post
    match 'users/foo'  => 'users#hoge',:via => :post
    
[/code]

とすることで

[code]

    users_hoge POST   /users/hoge(.:format)
    users_foo  POST   /users/foo(.:format)
    
[/code]

という結果が得られます。`match 'users/:action'`という方法もありますが  
そちらの方法は、上で引用した railsguides.jp の内容を確認してください。

そして、form_forには

[code]

    form_for @users, url: users_hoge_path
    form_for @users, url: users_foo_path
    
[/code]

とすれば良いでしょう。


CC BY-SA 3.0
2015-03-18T10:14:19.280
8070
2015-03-18T10:14:19.280
8335
8061
answer


「Railsのレールに乗る」という観点から言うと、resourceルーティングを活用した方がベターかなと思います。

というわけでこんなふうにしてみるのはどうでしょうか？

[code]

    # routes.rb
    resources :users do
      collection do
        post :hoge
        post :foo
      end
    end
    
    # rake routes
    hoge_users POST /users/hoge(.:format) users#hoge
    foo_users  POST /users/foo(.:format)  users#foo
    
    # view
    form_for @user, url: hoge_users do |f|
    # ...
    form_for @user, url: foo_users do |f|
    
[/code]

ちなみに`@users`の中身は1件のUserだと思うので、単数形の`@user`の方が良いと思います。  
複数形だと配列のように見えてしまうので。


CC BY-SA 3.0
2015-03-18T19:38:07.470
8082
2015-03-18T19:38:07.470
85
8061
answer