質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

link_toの中で表示しているページのURLからパラメーターを取得する

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,300

lyzmfeqpxs54

score 193

link_toの中で現在表示しているページのURLからパラメーターを取得し、変数として使用したいのですが、調べてもわからず、こちらで質問させていただきました。

現在表示しているページは「/user/XXXXXXXX」のような形でX部分はランダムに文字を生成したものとしています(ユーザーごとのページのような感じです)。このページごとにデータベースがあり、それをcsv形式でダウンロードしようとしています。

下記ページを参考にurlが固定であればcsvとしてダウンロードできたのですが、ページのURLに変数が含まれている場合どのようにすればよいのでしょうか。

http://qiita.com/oharato/items/414b7e5a61034bf8311c

ご教示いただければ幸いです。
よろしくお願いいたします。

表示ページは「/user/XXXXXXXX」でXXXXXXXXを取得し
以下のような形で変数部分にXXXXXXXXを入れたいと考えています。

<%= link_to 'csv download', '/user/変数/index.csv' %>
# app\controllers\user_controller.rb

def check
    # @idnihaURL末尾の8桁のランダム文字列が格納される(ex. TFMIQWYM)
    @id = params[:id]
    @user = User.exists?(email: @id)
    if @user
      @userenter =  User.find_by(email: @id)
      # @maildbs = Maildb.all
      @maildbs = Maildb.paginate(page: params[:page], per_page: 10)


      respond_to do |format|
        format.html
        format.csv do
          filename = 'maildbs'
          headers['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\""
        end
      end


      render 'user/personal'
      return
    else
      render plain: "存在しないページ"
      return
    end
  end




# routes.rb

get "user/:id" => "user#check"






# app\views\user\personal.html.erb

<% @maildbs.each do |maildb| %>
  <div class="maildbs-index-item">
    <div class="maildbs-right">
      <%= maildb.date %>
      <%= maildb.time %>
      <%= maildb.xxxx %>
      <%= maildb.xxxx %>
    </div>
  </div>
<% end %>

<!-- 各ページへのリンク -->
<%= will_paginate @maildbs %>
<!-- @userenter.emailには乱数が格納されている -->
<%= link_to 'csv download', "/user/#{@userenter.email}.csv" %>





#  app\views\user\index.csv.ruby

require 'kconv'
columns = [:name, :email, :to, :cc, :bcc]
res = ""
res << columns.map{|c| User.human_attribute_name c }.join(',')+"\r" # header
@users.pluck(*columns).each do |u|
  res << u.join(',')+"\r" # body
end
res.tosjis
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • suzukis

    2017/08/29 12:50

    現状のコントローラのコードとルーティングの設定(routes.rb)の内容を追記してください

    キャンセル

  • lyzmfeqpxs54

    2017/08/29 13:04

    「user/xxxxx」のようなページを実行した場合、「xxxxx」部分をデータベースに照らし合わせて、その乱数が登録されていればそのユーザーページを表示するといった形です。

    キャンセル

  • suzukis

    2017/08/29 15:28

    link_toで生成されるURLに変数を埋め込みたい、という質問かと思ったのですが、ビューの最後には<%= link_to 'csv download', "/user/#{@userenter.email}.csv" %>と言うコードがあります。質問の趣旨がよくわかりません。何がしたいのか、何は出来ていて何ができないのか、を整理して書いてもらえませんか。

    キャンセル

  • lyzmfeqpxs54

    2017/08/29 17:47

    度々のご回答ありがとうございます。タイトルには反してしまいますが、結局やりたいことはuser/XXXXXX.csvにアクセスした際にcsvをダウンロードできるようにしたいのです。いろいろな方のご教示のもと試行錯誤していますが現状「user/XXXXXX.csv」へのルーティングはできていそうなのですがapp\controllers\user_controller.rbの「render 'user/personal'」部分でエラーが出てしまいます。直接user/XXXXXXにアクセスした場合は「render 'user/personal'」できちんと表示されるのに今回エラーが出てしまっているのがよく分かりません。

    キャンセル

回答 3

0

<%= link_to "csv download", request.path_info + "/index.csv" %>


でどうでしょう。
requestオブジェクトで現在処理中の情報を取得できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 15:17

    ご回答ありがとうございます。ご教示いただいた方法をためしてみたのですがNo route matches [GET] "/user/XXXXXX/index.csv"エラーが出てしまいます。

    参考URLでcsvダウンロードを作った際は、ページがindexであり上に追記しましたindex.csv.rubyファイル(上に追記しました)を作成することでルーティングをせずに住んでいましたが、今回のように末尾が乱数の場合XXXXX.csv.rubyといったファイルが作れないことから何かルーティングを変更する必要があるのでしょうか。ご教示いただければ幸いです。

    キャンセル

  • 2017/08/29 15:41

    https://railsguides.jp/routing.htmlのワイルドカードを使ったルーティングを参考にしてください。
    get 'users/*/index.csv', to: 'users#check'
    かな?
    リンクを生成する問題とルーティングの問題を切り分けてデバッグすると良いです。

    キャンセル

0

  • routes.rb
get "user/:id" => "user#check(.:format)", as: 'user_check'
  • view
<%= link_to 'csv download', user_check_path(format: 'csv', id: params[:id]) %>

または
<%= link_to 'csv download', user_check_path(format: 'csv') %>

で良いのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

ルーティングの設定は行っていますか?
http://www.rubylife.jp/rails/template/index8.html

ルールに基づいて変数を渡せばできるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/29 12:39

    ご回答ありがとうございます。
    参考にしたURLのやり方の場合、ルーティングの設定を行わないような形でした。今回の場合には必要と思われるのですがそのやり方が分からず、質問させていただきました。よろしければ具体的なやり方を教えていただけないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる