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

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

ただいまの
回答率

88.09%

link_toのヘルパーのところでエラーがでてしまいます。 wrong number of arguments (4 for 0..3)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,328

score 172

Mac Yosemite 
ruby 2.2.0p0 
Rails 4.2.0 


以下の記事をもとに、ソート順で並び替える実装をしました。 
http://www.virment.com/rails-sortable-table/ 

その記事ではindexのところでの実装だったため、

コントローラーは以下にし、
def sort_name
  #ソート順の記述
end

config/route.rb
にもルーティングを記述しております。

その上で、rake routesをして確認もしております。
sort_name_members GET    /members/sort_name(.:format)   members#sort_name

そこで、ですが、link_to のところに4つ引数を追加するとエラーが出てしまいます。

    link_to title, sort_name_members_path, {:sort => column, :direction => direction}, {:class => css_class}

エラー内容

Rendering 500 with exception: wrong number of arguments (4 for 0..3)


尚、以下の2つだとエラーはでないものの、classが適応されていないため、ソートが上手くいきませんでした。

    link_to title, sort_name_members_path, {:sort => column, :direction => direction}

    link_to title, sort_name_members_path, {:sort => column, :direction => direction, :class => css_class}


調べていると似たような問題が出てきたため、以下を参考に、()を入れたりして対処していたのですが、上手く動作が出来ませんでした。

参考:
https://teratail.com/questions/2578

どなたか助言頂けないでしょうか?
宜しくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

ページの通りdef index; end でのソートで試してみました

そのあとで、ヘルパーで利用するlink_to にsort_name_members_path のようなパスの指定を追加すると質問にあるエラーが表示されました

# コントローラとルートの変更にヘルパーメソッドを合わせる

現状のエラーが出ている形式ではなく、sort_name_members_path にパラメータを渡す形...

link_to title, users_sort_name_path({:sort => column, :direction => direction, :class => css_class})
...にすると、エラーもなく、指定のパスにパラメータを渡すことができるのではないでしょうか

(Ruby のバージョンが古すぎなければ
link_to title, users_sort_name_path(sort: column, direction: direction, class: css_class)
といった書き方ができると思います)

# link_to

API ドキュメントを参照すると、受け付ける引数の数と種類は
link_to(name = nil, options = nil, html_options = nil, &block)
のようになっています

# Hash の{} 省略

def foo(title, args)
  p args[:name]
  p args[:age]
end

foo('foo', name: 'bar', age: 10)
# => 'bar'
# => 10


ソート処理をどのように実現しているか(クエリ パラメータを渡してソートする)を忘れなければ、どのような変則パターンにも対応できると思います

簡単に調べてみましたが、何か参考になれば幸いです

(参考にされた記事がさらに参照しているページが2010 年のものであることに留意してください)

# Links

Ruby on Rails API
ActionView::Helpers::UrlHelper - Ruby on Rails API
ruby on rails - Add querystring parameters to link_to - Stack Overflow

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/26 12:59

    ご回答ありがとうございます。
    参考URLが多くて、とても参考になりました。
    ご回答頂いた内容で、解決することができました!

    キャンセル

  • 2015/10/26 15:25

    解決済みであれば、「ベストアンサー」を選択していただければ助かります

    キャンセル

  • 2015/10/29 22:38

    おそくなりましたが、ベストアンサー致しました。この度は有り難う御座いました!

    キャンセル

0

まず、link_to の API ドキュメントやソースコードをみてみます。
- APIDOC link_to http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to
... link_to(name = nil, options = nil, html_options = nil, &block) public

- ActionView::Helpers::UrlHelper link_to http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to
... link_to(name = nil, options = nil, html_options = nil, &block)

- link_toでurlをそのまま表示したaタグを作りたかったら第一引数をnilに http://qiita.com/sue738/items/e7bcac8bae403760af82
...
def link_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options, name = options, name, block if block_given?
  options ||= {}
 
  html_options = convert_options_to_data_attributes(options, html_options)
 
  url = url_for(options)
  html_options['href'] ||= url
 
  content_tag(:a, name || url, html_options, &block)
end

4 つ目のパラメータはブロックです。

ブロックを使った指定例は以下にあります。
- How to use link_to in Rails http://mixandgo.com/blog/how-to-use-link_to-in-rails
...
<%= link_to root_path do %>
  <%= content_tag :span, "Home", :class => "home-link" %>
<% end %>
これは、次の書き方と同等です。
<%= link_to "<span class='home-link'>Home</span>".html_safe, root_path %>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/26 12:58

    ご回答ありがとうございます。
    調べるにあたっての手順を詳しく書いて頂き助かりました。

    次回、同じような問題にあたったとき、この手順を参考に
    事故解決できるよう頑張ってみます!

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る