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

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

ただいまの
回答率

89.97%

Ruby on rails: form_forで受け取ったパラメータを指定のコントローラーに渡したい

解決済

回答 1

投稿 編集

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

RyuSuzuki

score 125

前提・実現したいこと

お世話になります。
今、Ruby on railsとTwitterAPIを用いて、特定の文字列を検索してWebページに表示させるという
Webアプリケーションを作成しています。

発生している問題・エラーメッセージ

index.html.erb内のフォームから受け取ったパラメータを、Timelineコントローラーに送って
hogeingアクションを起こしたいのですが、formで入力したパラメータを送れません。
お願いします。


エラーメッセージ

Showing /home/ubuntu/workspace/myapp/app/views/timelines/index.html.erb where line #4 raised:
First argument in form cannot contain nil or be empty4列目は以下のソースに書いてあります

該当のソースコード

Ruby on railsで開発

[index.html.erb]
...
<div>
<%= form_for @twitter do |f|%>
#この上のformの行がエラーメッセージにおける line #4 です
        <%= f.label :word, "Test" %>
        <%= f.text_field :word %>
    <%= f.submit '取得する' %>
<% end %>
</div>
...
[routes.rb]
Rails.application.routes.draw do
  resources :timelines
  root 'timelines#index'
  #試してみてダメだったもの
  # post '/timelines' => 'timeline#hogeing'
  post '/' => 'timelines#hogeing'
end
[timelines_controller.rb]
class TimelinesController < ApplicationController
    def index
        @twitter = Timeline.new
    end

    def hogeing
        # エラー確認用
        if @twitter && params[:word]
            # インスタンス作成
            @twitter = Timeline.new
            # 検索ワード取得
            @twitter.word = params[:word]
            word = @twitter.word
            # 検索、最近のツイート50件を取得
            @twitter.tweet = @twitter.client.search(word, lang: "ja", result_type: 'recent', count: 50).map do |tweet|
                {
                    icon: tweet.user.profile_image_url,
                    name: tweet.user.name,
                    text: tweet.text,

                }
                end
        end
        render action: "index" 
    end
end

試したこと

・routes.rbでpost元とpost先の変更(ソース中に書いてある通り)

・[index.html.erb]内の
<%= form_for @twitter, :url => root_path do |f|%>
を
<%= form_for @twitter do |f|%>
に書き換える(createコマンドが必要と言われました。)

補足情報(言語/FW/ツール等のバージョンなど)

cloud9上で開発中。rake routesコマンドでは以下が表示されています。

> Username:~/workspace/myapp $ rake routes
>       Prefix Verb   URI Pattern                   Controller#Action
>    timelines GET    /timelines(.:format)          timelines#index
>              POST   /timelines(.:format)          timelines#create
> new_timeline GET    /timelines/new(.:format)      timelines#new
> edit_timeline GET    /timelines/:id/edit(.:format) timelines#edit
>     timeline GET    /timelines/:id(.:format)      timelines#show
>              PATCH  /timelines/:id(.:format)      timelines#update
>              PUT    /timelines/:id(.:format)      timelines#update
>              DELETE /timelines/:id(.:format)      timelines#destroy
>         root GET    /                             timelines#index
>              POST   /timelines(.:format)          timeline#hogeing
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

routesの記述で、パスの重複が原因で、後から指定した方がうまく解決できていないのではないかと思います。

パスにこだわりがあって、どうしてもtimeline#hogeingを/timelinesで解決したいのであれば、リソース側のcreateのパスを削除する必要があるでしょう。

[routes.rb]
Rails.application.routes.draw do
  resources :timelines, except[:create]
  root 'timelines#index'
  post '/' => 'timelines#hogeing'
end


createアクションは別に定義したいし、hogeingアクションのパスにもこだわりがないのであれば、以下の様にするのが一番自然でしょう。

[routes.rb]
Rails.application.routes.draw do
  resources :timelines do
    post :hogeing
  end
  root 'timelines#index'
end

[index.html.erb]
...
<div>
  <%= form_for @twitter, url: hogeing_timeline_path, method: :post do |f|%>
    <%= f.label :word, "Test" %>
    <%= f.text_field :word %>
    <%= f.submit '取得する' %>
  <% end %>
</div>
...

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/01 21:42

    ご回答ありがとうございました…!二ついただけるとは、感謝です…!
    二つとも、それぞれ動いてくれました。ありがとうございます!

    キャンセル

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

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