プロが教える店舗&オフィスのセキュリティ対策術

ご教授いただければ幸いです。
====================================
carts/index → carts/deliveryへリンクしたい
===================================
button_toを使うとちゃんと動きますが
<%= button_to "購入する" , :controller => 'carts', :action => 'delivery' %>

画像に替えると上手く動きません。
<%= link_to (image_tag ("/images/cart_next.png"),:size=>"180x40")),'/delivery',{:method => :post}) %>

link_toやbutton_toを使用して画像にリンクを貼る方法はございますでしょうか?


===================================
carts/controller.rb
===================================
def index
@cart = find_cart
end#

def find_cart
session[:cart] ||= Cart.new
end

def delivery
@cart = find_cart
@addressee = Addressee.new()
end

A 回答 (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形式のファイル)がありますでしょうか?
    • good
    • 0
この回答へのお礼

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

たくさんのお手間をおかけしました事をお詫び申し上げます。
そして最後まで原因を考えてくださった事、深くお礼と感謝を申し上げます。

お礼日時:2011/08/19 00:01

>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/?b04e4d13265235dd497a …
にこちらで使用しているrails.jsが格納してありますのでダウンロードして、
あなたが使用しているrails.jsと置き換えた後、試験してください。
(もちろん現行のrails.jsはバックアップをとり、後で戻せるようにしておいてください。)

以上が、最後の確認になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/18 19:42

>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について確認して頂けませんでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/17 14:49

こちらの環境は


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'の両端を{}で囲む)
とされた場合は、どうなりますでしょうか?
これでも、だめだとすると、申し訳ありませんがギブアップになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/14 22:22

>教えていただいたコードで試してみましたが、やはり同じ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コマンド)を使用しています。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/14 11:15

>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-li …
ここの「ruby-list(日本語)」が良いかと思います。
私も、以前、参加していました。(今は参加していません)
ruby作者の「まつもとゆきひろ」さんも時々、ここで発言していますので、
質は高く、結構活発にメールが飛び交っています。
参加した場合、メールの量が増えますので、その覚悟は必要になります。
また、ここはrubyが主体なのでruby on railsについてどこまで、質問可能かは
私もわかりません。(事前に一度、ruby on railsの問い合わせもOKかどうか、確認されて
みればよいかと思います)

もう1つの候補として、
http://wiki.fdiary.net/rails/
があります。
こちらは、そのものずばりなので、ruby on railsの場合は、こちらのほうが
よいかも知れません。railsの勉強会の情報もあるので、それにも参加すれば、
さらに情報が入手しやすくなるかも知れません。
ここは、私は、参加したことがありませんので、参考情報として扱ってください。
    • good
    • 0
この回答へのお礼

ご教授ありがとうございます。
教えていただいたコードで試してみましたが、やはり同じUnknown actionのエラーがでました^^;
ルートを修正するのが無難な方法でしょうか?^^;
<%= link_to(image_tag('/images/cart_next.png',:alt =>'購入する', :size =>'180x40'),'/carts/delivery',:method=>'post') %>


メールサポートの件は了解致しました。
こちらこそ無理を申し上げてすみませんでした^^;

「Ruby on RailsのWiki」こちらのサイトはいいですね!
早速、登録してみました。railsの勉強会にも参加してみようと思います。
ご親切にありがとうございました^^

お礼日時:2011/08/12 22:14

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 => '検索') %> ・・・このようにします。

追伸:
前回の質問に回答したとき、追加の質問をされましたが、それは解決しましたでしょうか。
回答をしようと思ったのですが、既に質問が締め切られていた為に、回答できませんでした。
もし、未解決であれば、再度、同じ質問を、新たに投稿してください。
今後は、追加の質問をした場合は、締め切らないようにしておいてください。
若しくは、更に質問がある場合は、締め切った後、新たに質問を投稿するようにしてください。
    • good
    • 0
この回答へのお礼

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を使った場合等
深い内容で質問したい事がでてきた時には
メールサポート(有料)をお願いできないでしょうか?

厚かましいお願いですので、無理な場合はスルーしてください^^:

お礼日時:2011/08/11 14:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!