- ベストアンサー
rails3初心者 画像にリンクを貼りたい
- carts/index → carts/deliveryへリンクしたい
- button_toを使うとちゃんと動きますが画像に替えると上手く動きません。
- link_toやbutton_toを使用して画像にリンクを貼る方法はございますでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>2)carts/indexでは、スクリプトが表示されていませんでした^^; とりあえず、POSTが送信されない原因が判明しましたので、よかったです。 ではなぜ、この画面を表示した場合のみ、rails.jsがブラウザへ転送されないのかが、 問題になります。 通常は、/app/views/layouts/の下に application.html.erbが存在し、 そのapplication.html.erbから個々のxxxx.html.erbが呼び出されます。 application.html.erbの内容は、 通常、以下のようになっています。 <!DOCTYPE html> <html> <head> <title>そのアプリケーションのタイトル</title> <%= stylesheet_link_tag :all %> <%= javascript_include_tag :defaults %> <%#= javascript_include_tag :all %> <%= csrf_meta_tag %> </head> <body> <%= yield %> </body> </html> 上記の<%= javascript_include_tag :defaults %> で、rails.js等が取り込まれ、ブラウザに送られるはずです。 carts/indexの場合のみ、application.html.erbが呼び出されていないようにみえます。 意図的に呼び出さないようにしている場合は、問題ありませんが、 そうでない場合は、application.html.erbが呼び出されるようにすべきです。 また、/app/views/layouts下には、application.html.erbのほかに 別のテンプレートファイル(xxx.html.erb形式のファイル)がありますでしょうか?
その他の回答 (6)
- tatsu99
- ベストアンサー率52% (391/751)
>1.ブラウザでjavascriptが無効になっている。#有効になっております。chrome FireFoxの両ブラウザで確認。 >2./public/javascripts/ に rails.js が存在しない。#rails.jsは存在いたします。 >3./views/layouts/ にapplication.html.erb が存在しない。#application.html.erbも存在いたします。 確認ありがとうございました。 こちらでもchromeで確認しましたところStarted POSTが表示されましたので、ブラウザの 問題ではないようです。 1.念のため、確認ですが、rails.jsはブラウザへ転送されているでしょうか? chromeの場合、ツール→javascriptコンソールでrails.jsの内容が表示されるはずです。 もし、表示されないなら、rails.jsがブラウザへ転送されないのが原因です。 2.もし、表示されているなら、rails.js自体が古いのが原因かも知れませんので、 こちらで使用しているrails.jsで再度試験して頂けませんでしょうか? http://www4.gigafile.nu/v3/?b04e4d13265235dd497ad7ed92960201 にこちらで使用しているrails.jsが格納してありますのでダウンロードして、 あなたが使用しているrails.jsと置き換えた後、試験してください。 (もちろん現行のrails.jsはバックアップをとり、後で戻せるようにしておいてください。) 以上が、最後の確認になります。
お礼
tatsu99様 いつもご教授ありがとうございます。 tatsu99さん、rails.jsを確認しましたところ、いくつかの発見がございました! (スプリクトはfirebug等のツールで確認しております) 1) products/index等ではスプリクトが表示されていました。 試しにここで問題のリンクをはってみたところ<%= link_to(image_tag~%> ルートを修正ぜずにStarted POSTになりPOST送信されました! 2)carts/indexでは、スクリプトが表示されていませんでした^^; =================================== carts/index.html =================================== この対策として、この一行を追加したら、スクリプトが表示されるようになり、 ルートを修正ぜずにログがStarted GETからStarted POSTの表示になりました! <%= javascript_include_tag :all %> <%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',{:method=>'post'}) %> ただ、<%= javascript_include_tag :all %>を追加する事で、問題点が出てきました。 <問題点> carts/index.html→carts/delivry.html carts/delivry.html で、カートに入れた商品名等が表示されなくなったのです^^; 例えば、 carts/indexでは以下を表示しています。 商品名:りんご 数量 :2個 価格 :200円 carts/delivry.htmlでは 商品名:りんご 数量 :2個 価格 :200円 + お届け先の情報を記入するフォーム となっているのですが、#<%= javascript_include_tag :all %>を追加する事で商品名等の情報が表示されなくなりました。 カート内の商品名や数量や価格等の情報は、一旦セッションに格納されています。 つまり、セッションに格納されたデータをcarts/delivry.html以降のページでは表示できなくなるという状態なのです。 この対策方法を現在模索中ですが、 (まだrails.jsの書き換えによる対策はまだ試していませんので、こちらも一旦試験してみようと思います) <%= javascript_include_tag :all %>を追加する事で、スプリクトが表示されるようになりましたので 一旦ご報告させていただきます。 tatsu99さんの「rails.jsがブラウザへ転送されないのが原因」というご指摘とおりでした^^; 色々とお調べいただきまして、本当にありがとうございましたm(_ _)m
- tatsu99
- ベストアンサー率52% (391/751)
>URLを確認してみましたところ ><%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',{:method=>'post'}) %> ↓POSTのURLを生成してくれてました。({}で囲まないパターンでも一緒同じURLでした) ><a href="/carts/delivery" data-method="post" rel="nofollow"> >Started GET "/carts" for 127.0.0.1 at 2011-08-14 22:10:33 +0900 ご確認、ありがとうございました。 正しく、POSTが送信されない(Started POST "/carts/delivery"にならない)原因が、判明しました。 結論から言いますと、 <a href="/carts/delivery" data-method="post" rel="nofollow">のタグから POSTを送信するのは、javascript(rails.js)の役目です。 詳細は下記のURLを参照ください。 http://www.oiax.jp/rails/rails3/finish_task.html この中で、 <a href="/tasks/1/finish" data-method="put" rel="nofollow">完了</a>この a タグがちゃんと「動く」のは、Rails 3.0 で 導入された /public/javascripts/rails.js が存在するためです。 JavaScript に詳しい方は、中身を覗いてみると面白いでしょう。 の記述がありました。 従って、考えられる原因は 1.あなたのブラウザでjavascriptが無効になっている。--->有効にすれば、解決。 2.上記でだめなら、 /public/javascripts/ に rails.js が存在しない。 3.上記のrails.jsがあるなら、 /views/layouts/ にapplication.html.erb が存在しない。 が考えられます。 (項番2,3は正しい手順で、アプリケーションを作成すれば、自動的に作成されるはずです。) 上記の1,2,3について確認して頂けませんでしょうか?
お礼
tatsu99様 いつもご教授ありがとうございます。 Started POSTにならない原因をお調べいただき、ありがとうございます。 ご指示通りに1,2,3の手順で確認してみましたが、 やはり同じくルートを修正しないとUnknown actionのエラーが出ます。 Unknown action The action 'show' could not be found for CartsController javascriptの原因ではなさそうです。。 1.ブラウザでjavascriptが無効になっている。#有効になっております。chrome FireFoxの両ブラウザで確認。 2./public/javascripts/ に rails.js が存在しない。#rails.jsは存在いたします。 3./views/layouts/ にapplication.html.erb が存在しない。#application.html.erbも存在いたします。 私もググッてみたのですが、明確な答えがでてこなかっったので 以前教えていただいた、Ruby on Rails wikiのサイトでこの疑問を質問してみました。 レスポンスが来ましたら、またご報告させていただきます。 いつもご丁寧にありがとうございますm(_ _)m
- tatsu99
- ベストアンサー率52% (391/751)
こちらの環境は windows-7 Rails 3.0.7 ruby 1.9.2p180 です。 こちらでは、 Started POST "/carts/delivery" for 127.0.0.1 のメッセージが表示され、HTTPメソッドはPOSTでサーバーに送っていることが確認されるのですが、 そちらの環境では、 Started GET "/carts/delivery" for 127.0.0.1 となっておりますので、HTTPメソッドはGETでサーバーに送っていることになります。 従って、ルート制御の問題でないことは明らかです。 個人的な想像ですが、 <%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',:method=>'post') %> を私の環境では、最終的に <a href="/carts/delivery" rel="nofollow" data-method="post"> にrailsが展開してくれるのですが、 あなたの環境では、 <a href="/carts/delivery" rel="nofollow" data-method="get"> になっていると考えられます。 つまり、 ,:method=>'post'の部分が正しく反映されていないと考えられます。 なぜ、そのなるのかは、残念ながら私のスキルでは、判断できません。 railsのバージョンによる違い、または(可能性は薄いですが)MacとWindowsによる違い、 または、railsのバグが考えられます。 一応、最後の確認になりますが、 <%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',{:method=>'post'}) %> (:method=>'post'の両端を{}で囲む) とされた場合は、どうなりますでしょうか? これでも、だめだとすると、申し訳ありませんがギブアップになります。
お礼
tatsu99様 いつもご教授ありがとうございます。 :method=>'post'の両端を{}で囲む方法で試してみましたが、やはり同じエラーが出ます^^: URLを確認してみましたところ <%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',{:method=>'post'}) %> ↓POSTのURLを生成してくれてました。({}で囲まないパターンでも一緒同じURLでした) <a href="/carts/delivery" data-method="post" rel="nofollow"> Started GET "/carts" for 127.0.0.1 at 2011-08-14 22:10:33 +0900 つまり、HTTPメソッドはGETでサーバーに送ってますが、生成されるURLがPOSTのためエラーが発生してるという事でしょうか?^^: 奥が深いですね^^; 前に教えていただいたコミュニティ等で聞いてみて、原因を調べてみようと思います。 tatsu99さんがこの問題を追求してくださったおかげで、なんだか楽しくなってきました。 原因が分かりましたら、ご報告させていただきます。 ありがとうございましたm(_ _)m
- tatsu99
- ベストアンサー率52% (391/751)
>教えていただいたコードで試してみましたが、やはり同じUnknown actionのエラーがでました^^; >ルートを修正するのが無難な方法でしょうか?^^; <%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),'/carts/delivery',:method=>'post') %> こちらでは、上記のコードで正しく動作しています。 念のため確認ですが、 <%= button_to "購入する" , :controller => 'carts', :action => 'delivery' %> をクリックしたときは、正しく動作していますか。 もし、button_toも正しく動作しないならルートの修正を正しく元に戻していないことになります。 <%= button_toが正しく動作している場合は、原因がよく判りません。 その場合、サーバー側では、どのようなメッセージが出力されていますか? こちらでは、 link_toの場合、 Started POST "/carts/delivery" for 127.0.0.1 at 2011-08-12 23:10:04 +0900 Processing by CartsController#delivery as HTML Parameters: {"authenticity_token"=>"qTfXVieCUOrowky0wop+3lWz3cpdVVU7EzRqB8CQzZE="} Rendered text template (0.0ms) Completed 200 OK in 1ms (Views: 0.0ms | ActiveRecord: 0.0ms) button_toの場合 Started POST "/carts/delivery" for 127.0.0.1 at 2011-08-12 23:10:55 +0900 Processing by CartsController#delivery as HTML Parameters: {"authenticity_token"=>"qTfXVieCUOrowky0wop+3lWz3cpdVVU7EzRqB8CQzZE="} Rendered text template (0.0ms) Completed 200 OK in 0ms (Views: 0.0ms | ActiveRecord: 0.0ms) のようなメッセージが出力されます。 このようなメッセージの内容を教えていただけませんでしょうか? (こちらのテスト環境はWindows-7 でWEBrick(rails serverコマンド)を使用しています。)
お礼
tatsu99様 いつもご教授ありがとうございます。 私の方の環境は =============== MacOS Ruby1.9.2 Rails3.0.4 rails s コマンドでseverを起動させています。 =============== button_toでは正しく作動しております。 ====================== <button_toの場合> ====================== <%= button_to "レジに進む" , :controller => 'carts', :action => 'delivery' %> resources :carts do #ルートはdeliveryのみ書いております。 collection do post :delivery end end ******************************************** Started POST "/carts/delivery" for 127.0.0.1 at 2011-08-14 10:42:50 +0900 Processing by CartsController#delivery as HTML Parameters: {"authenticity_token"=>"b+OXq1kneBpn2Nhd1wM6AyvY+w0zbYTWzw6IPfWH7oY="} Rendered carts/_cart_item.html.erb (11.4ms) Rendered shared/_header.rhtml (0.6ms) Rendered shared/_footer.rhtml (0.3ms) Rendered carts/delivery.html.erb within layouts/carts (29.4ms) Completed 200 OK in 91ms (Views: 32.5ms | ActiveRecord: 1.9ms) ====================== <link_toの場合> #エラーがでたログです ====================== <%= link_to(image_tag('/images/cart_next.png', :alt => 'レジに進む', :size=>'180x40'),'/carts/delivery',:method=>'post') %> ************************************************* Started GET "/carts/delivery" for 127.0.0.1 at 2011-08-14 10:32:52 +0900 AbstractController::ActionNotFound (The action 'show' could not be found for CartsController): Rendered .bundle/ruby/1.9.1/gems/actionpack-3.0.4/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb within rescues/layout (0.8ms) ====================== <link_toでルートを修正した場合> #動作はしております。 ====================== match '/carts/delivery', :controller => 'carts', :action => 'delivery' resources :carts ******************************************** Started GET "/carts/delivery" for 127.0.0.1 at 2011-08-14 10:40:09 +0900 Processing by CartsController#delivery as HTML Rendered carts/_cart_item.html.erb (11.7ms) Rendered shared/_header.rhtml (0.9ms) Rendered shared/_footer.rhtml (0.3ms) Rendered carts/delivery.html.erb within layouts/carts (69.1ms) Completed 200 OK in 91ms (Views: 72.8ms | ActiveRecord: 2.4ms) ====================== class CartsController < ApplicationController ====================== carts_controllerの全コードです。 def index @cart = find_cart end def find_cart session[:cart] ||= Cart.new end def add @cart = find_cart @cart.add_cart_item(params[:id].to_i) @cart.select_quantity(params[:id],params[:product][:quantity].to_i) #プルボタンで選ばれた数字の処理 redirect_to :action => 'index' end def change_quantity @cart = find_cart @cart.change_quantity(params[:id],params[:cart_item][:quantity].to_i) redirect_to :action => 'index' end def delete_cart_item @cart = find_cart @cart.delete_cart_item(params[:id].to_i) redirect_to :action => 'index' end def delivery @cart = find_cart @addressee = Addressee.new() end def confirm @cart = find_cart @addressee = Addressee.new(params[:addressee]) unless @addressee.valid? render :action => 'delivery' end end def delivery_save @cart = find_cart @addressee = Addressee.new(params[:addressee]) @addressee.add_order_items_from_cart(@cart) if @addressee.save Email.test(@addressee,@cart).deliver render :action => 'delivery_save' else render :action => 'delivery' end end tatsu99さんの方では正しく動作されているのですね。 sessionの絡みかしら…^^; お手間もかかりますし、もし原因が分かりましたらご教授どうぞよろしくお願い致しますm(_ _)m
- tatsu99
- ベストアンサー率52% (391/751)
>Unknown actionエラーが出たので、ルートがおかしいのかな?と思い 大変失礼しました、以下のようにして下さい。 <%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),'/carts/delivery',:method=>'post') %> これで、ルート修正せずに、解決するはずです。 >深い内容で質問したい事がでてきた時には >メールサポート(有料)をお願いできないでしょうか? 私は、そこまでのスキルは持っていませんので、代わりといっては何ですが、メーリングリストを 利用されてはいかがでしょうか。 http://www.ruby-lang.org/ja/community/mailing-lists/ ここの「ruby-list(日本語)」が良いかと思います。 私も、以前、参加していました。(今は参加していません) ruby作者の「まつもとゆきひろ」さんも時々、ここで発言していますので、 質は高く、結構活発にメールが飛び交っています。 参加した場合、メールの量が増えますので、その覚悟は必要になります。 また、ここはrubyが主体なのでruby on railsについてどこまで、質問可能かは 私もわかりません。(事前に一度、ruby on railsの問い合わせもOKかどうか、確認されて みればよいかと思います) もう1つの候補として、 http://wiki.fdiary.net/rails/ があります。 こちらは、そのものずばりなので、ruby on railsの場合は、こちらのほうが よいかも知れません。railsの勉強会の情報もあるので、それにも参加すれば、 さらに情報が入手しやすくなるかも知れません。 ここは、私は、参加したことがありませんので、参考情報として扱ってください。
お礼
ご教授ありがとうございます。 教えていただいたコードで試してみましたが、やはり同じUnknown actionのエラーがでました^^; ルートを修正するのが無難な方法でしょうか?^^; <%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),'/carts/delivery',:method=>'post') %> メールサポートの件は了解致しました。 こちらこそ無理を申し上げてすみませんでした^^; 「Ruby on RailsのWiki」こちらのサイトはいいですね! 早速、登録してみました。railsの勉強会にも参加してみようと思います。 ご親切にありがとうございました^^
- tatsu99
- ベストアンサー率52% (391/751)
link_toの場合、以下のようにしてください。 <%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),{:controller => 'carts', :action => 'delivery',:method=>'post'}) %> 尚、submit_tagと同じ機能を画像で実現したい場合は <%= submit_tag "検索"%> ・・・これを <%= image_submit_tag ('/images/xxx.png',:alt => '検索') %> ・・・このようにします。 追伸: 前回の質問に回答したとき、追加の質問をされましたが、それは解決しましたでしょうか。 回答をしようと思ったのですが、既に質問が締め切られていた為に、回答できませんでした。 もし、未解決であれば、再度、同じ質問を、新たに投稿してください。 今後は、追加の質問をした場合は、締め切らないようにしておいてください。 若しくは、更に質問がある場合は、締め切った後、新たに質問を投稿するようにしてください。
お礼
tatsu99様 _rinです。 いつもご教授ありがとうございます。出来ました! <%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),{:controller => 'carts', :action => 'delivery',:method=>'post'}) %> 実装してみましたら、 Unknown actionエラーが出たので、ルートがおかしいのかな?と思い ルートを修正してみましたがこの方法で合っておりますでしょうか?(動作はしております。) エラー内容 Unknown action The action 'show' could not be found for CartsController 修正前のルート↓ resources :carts do collection do post :delivery end end 修正後のルート↓ match '/carts/delivery', :controller => 'carts', :action => 'delivery' resources :carts ================================== ベストアンサーを選択すると、ご回答いただけなくなるのですね^^; 前回の応用の質問も、回答しようとしてくださっていたのですね。 ありがとうございます。 また失礼をお詫び致しますm(_ _)m 再度、投稿させていただきますので、またお手すきの時にでもご教授いただけると幸いです。 PS こちらの「質問!ITmedia」では、ご好意でご回答をいただき大変嬉しく思います^^ とても分かりやすい説明なので、理解が深まってきて、ここ最近成長できてる気がしています。 また、改めてお尋ねさせていただきますが、 メールでお尋ねしたい内容の時や、プラグインや jQueryを使った場合等 深い内容で質問したい事がでてきた時には メールサポート(有料)をお願いできないでしょうか? 厚かましいお願いですので、無理な場合はスルーしてください^^:
お礼
tatsu99様 ずばり/app/views/layouts下に application.html.erb cart.rhtmlがありました_l ̄l○ application.html.erbと同じように追加したら、先程の問題も解決できました。 /app/views/layouts/cart.rhtmlの記述ミスが今回の原因だったのですね。 ================================= *リンクに画像を貼った場合もアクションが指定できる事。 *そしてアクションがPOSの場合はjavascript(rails.js)で行われること。 *rails.jsはapplication.html.erbから呼び出されるようになっている事。 この問題はたくさんの事を勉強させていただきました。 本当にありがとうございましたm(_ _)m たくさんのお手間をおかけしました事をお詫び申し上げます。 そして最後まで原因を考えてくださった事、深くお礼と感謝を申し上げます。