6591


囲碁、オセロ、将棋を遊べるサイトがあります。

それぞれ、Igo、Othello、SyogiモデルはpolymorphicなGameモデルがhas_oneの関係で結びついています。

それぞれのゲームには以下のような、独立したページが存在します。

[code]

    http://example.com/Igo/1
    http://example.com/Othello/1
    http://example.com/Syogi/1
    
[/code]

このような条件で、オセロか将棋か囲碁のいずれかが代入されている@gameableポインタを持っているどこかのコントローラで、適切なページヘリダイレクトするには

[code]

    redirect_to @gameable
    
[/code]

と記述するだけで期待通りのリダイレクトが行われます。  
（なぜこれでリダイレクトしてくれるのかは把握してませんが…）

しかし、この条件のリダイレクトに加えてurlパラメータを添えたい場合には  
どうすればいいのかわかりません。

ifやswitchなどを利用して@gameableが囲碁なのかオセロなのか将棋なのかを判定し  
それぞれリダイレクトするしか方法は無いのでしょうか。


CC BY-SA 3.0
2015-02-16T10:00:39.647
6572
2015-02-16T22:37:29.597
5840
question
ruby-on-rails
rails4でpolymorphicなモデルにredirect_toするときにurlパラメータを渡す方法

[code]

    redirect_to send(@gameable.class.to_s.downcase+'_url', id: @gameable.id, param: 'hoge')
    
[/code]

で、なんとなく動作しました。  
少し無理矢理な気もするので、もう少し良い方法がありましたら  
是非教えていただきたいです。


CC BY-SA 3.0
2015-02-16T19:25:54.080
6590
2015-02-16T19:25:54.080
5840
6572
answer


`[ ]`で囲むとパラメータが有効になります。

[code]

    redirect_to [@gameable, param: 'hoge']
    
[/code]

### 解説

`redirect_to` のメソッド定義は以下のようになっています。

[code]

    def redirect_to(options = {}, response_status = {})
    
[/code]

参考: <http://apidock.com/rails/ActionController/Base/redirect_to>

`redirect_to @gameable, param: 'hoge'` と書くと引数が2つと解釈されます。  
なので、`options`に`@gameable`が、`response_status`に`{param: 'hoge'}`がそれぞれ渡されます。  
これだと意図した挙動になりません。

`redirect_to [@gameable, param: 'hoge']`と書くと引数が1つになります。  
よって、`options`に`[@gameable, param: 'hoge']`が渡されるようになります。

そしてこの引数が `url_for` メソッドに引き渡され、パラメータ付きのURLが生成されます。

参考:
<http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-
i-url_for>


CC BY-SA 3.0
2015-02-16T22:00:47.947
6591
2015-02-16T22:37:29.597
2015-02-16T22:37:29.597
85
85
6572
answer