2017-07-10 6 views
0

リソースのイベントが与えられたら、/events/1はURLバーの/events/1/column_nameに移動します。イベントDBの移行で列名はt.string :nameです。この列名は、リダイレクトする前にparameterizeを呼び出す必要があります。どのようにこれを行うにはどのようなアイデアですか?Rails 5でカスタムURLを作成するリソースの表示アクション

例:あなたはhttps://stackoverflow.com/users/4180797に移動した場合

URLは自動的にロード後https://stackoverflow.com/users/4180797/james-lowreyになります。 4180797/any-other-txt-hereの場合はtrueです。したがって、 "James Lowrey"はname列になり、parameterizeを呼び出した後にjames-lowreyになります。

+1

私はあなたの質問を理解したかどうか分かりませんが、例を挙げることはできますか? – Gerry

+0

お世話になりました! https://stackoverflow.com/users/4180797に移動すると、読み込んだURLは自動的にhttps://stackoverflow.com/users/4180797/james-lowreyになります。 '4180797/any-other-txt-here'に当てはまります。したがって、 "James Lowrey"は 'name'カラムになり、' parameterize'を呼び出して 'james-lowrey'になります。 –

答えて

0

[OK]これは実際にはわかりにくいものでした。以前はこれらの変数の多くにアクセスできたことさえ知りませんでした。

最初の編集あなたのconfig/routes.rbid/other_stuff

Rails.application.routes.draw do 
    resources :events 
    get "/events/:id/*other" => "events#show" #if any txt is trailing id, also send this route to events#show 
end 

次のURLが間違っている場合はリダイレクトするevent_controller.showを修正し確定します。

def show 
    #redirect if :name is not seen in the URL 
    if request.format.html? 
     name_param = @event.name.parameterize 
     url = request.original_url 
     id_end_indx = url.index(@event.id.to_s) + (@event.id.to_s).length + 1 #+1 for '/' character 
     ##all URL txt after id does not match name.parameterize 
     if url[id_end_indx..-1] != @event.name.parameterize 
     redirect_to "/events/#{@event.id}/#{name_param}" 
     end 
    end 
    end 

これは、質問で与えられたスタックオーバーフローの例とまったく同じ動作になります。

1

別のオプションは、例えば、ジャバスクリプト/ jQueryを使ってpushStateを使用するようになります。

まず、これは関係なく、負荷に毎回URLを変更しませんshow.html.erb

<script> 
    $(document).ready(function() { 
    history.pushState(null, null, "/events/<%= @event.id %>/<%= @event.name.parameterize %>"); 
    }); 
</script> 

に次のscriptを追加/:idの後に来るもの

第二に、/:id後に何かを受け入れる(そしてそれを無視)するルートを変更します。/:id後の任意のテキストが一致しない場合

Rails.application.routes.draw do 
    #... 
    get "/events/:id/*other" => "events#show" 
end 

このオプションは、リダイレクトを回避する追加の利点を持っている、それだけでidを取得しますそれ以降のテキストはURLの@event.name.parameterize(リロードなし)に置き換えてください。

+0

すばらしい解決策!これにより、リダイレクトが回避され、サーバー処理のビット数が節約されます。ユーザーがJSを無効にしても機能しないので、そこにはトレードオフがあります。答えをありがとう! –

関連する問題