• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:rails3初心者 年齢を表示する)

rails3初心者 年齢を表示する

このQ&Aのポイント
  • rails3初心者が年齢を表示する方法を知りたいです。
  • viewsとcontrollerのコードの書き方を教えてください。
  • プルダウンボタンで選択された年齢を表示するためのコードを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

>http://item.rakuten.co.jp/gekiyasukaguya/chair-panda?s-id=browsehist_top_normal このサイトの実装方法はわかりませんが、私は hidden_field_tagを使って、/animals/indexへ年齢を含めて渡す場合は、 以下のようにする方法しか思いつきません。 form_tagを2つ作成し、 1つ目は通常の(年齢の選択ができる)tag もう1つは、/animals/indexを呼び出すtagで、この中に、hidden_field_tagをつくる。 このhidden_field_tagに年齢を格納しておく。 但し、そのままでは、年齢が選択されても、その内容が、hidden_field_tagに反映されないので、 javascriptを使用して、年齢が選択されたとき、その内容を自動的にhidden_field_tag に格納するようにする。 ==================== views/prseons/show.html ==================== <h1>Presons#show</h1> <%= @preson.name %> <%= form_tag({:controller => 'animals',:action => 'age'}) do %> <%= select("form","age", (1..100),{:include_blank=>false},{:onChange=>"changeage(this.value)"})%> <%= submit_tag '表示する',:name=>'tag1' %> <% end %> <%= form_tag({:controller => 'animals',:action => 'index'}) do %> <%= hidden_field_tag('age',1,{:name=>'hiddenage'}) %> <%= submit_tag '次へ進む' %> <% end %> <script type="text/javascript"> <!-- document.write("javascriptによるbutton_toのurlの直接書き換え試験") function changeage(value) { alert(value); document.forms[1].hiddenage.value = value; } //--> </script> ==================== animals_controller.rb ==================== def index age = params[:hiddenage] ・・・年齢の取得   ・・・・以下省略 end

_rin
質問者

お礼

tatsu99様 _rinです。 hidden_field_tagを使用したやり方も書いてくださっていたのですね。 ご丁寧にありがとうございましたm(_ _)m つい先ほどANo.6でご教授くださった事をヒントに、やりたかった事が実装できました。 hidden_field_tagを使う方法も試してみます。 ANo.6のお礼コメントはご覧いただけましたでしょうか?…やっぱり無理でしょうか^^;

その他の回答 (6)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

>質問1)presons/showページの選択された年齢をsubmitボタンを押さずに、 animals/indexで引き継ぎたい。 submitを使用せずに、butoon_toのボタンを使用する場合、選択した年齢の情報がサーバーに送られません。従って、通常は、以下の方法をとるのが、良いかと思います。 submitボタンを2つ作成します。 1つ目は通常の用途に使用。 もう1つは、今回の用途に使用する。 submitボタンは以下のように記述します。 <%= submit_tag '表示する',:name=>'tag1' %> ・・・通常用 <%= submit_tag '次へ進む',:name=>'tag2' %> ・・・次へ用 どちらのボタンを押しても class AnimalsControllerのageが実行されます。 ageは以下のように記述します。 def age if params[:tag1] p 'normal(tag1)' ・・・・通常の処理 else p 'next(tag2)' ・・・・次への処理 end end ------------------------------------------------ なお、どうしてもbutton_toを使用する場合は、 button_toで記述したurlを年齢が選択されるごとに、強引に書き換える方法があります。 その場合は、javascriptでその部分の書き換えを行ないます。 <%= button_to('次へ進む','/animals/index/1') %> のように定義して、ボタンを押すと animalsのindexが呼び出されます。params[:id]で1 が取得できます。(1は年齢) 年齢で16が選択された場合、 '/animals/index/1' を '/animals/index/16' にjavascriptで書き換えます。 そうするとparams[id]で取得した値は、16になります。 但し、この方法は推奨しません。

_rin
質問者

お礼

tatsu99様 _rinです。いつもご教授ありがとうございます。 !! submitを使う事で、情報がサーバーに送られるのですね^^; ユーザーにはひとつのボタンを押すだけで済むような形にしたかったので ボタンはひとつにして、def age に2つのロジックを書く形で解決できました。 ここ数日間、tatsu99さんのおかげで少し成長できた気がします。 本当にありがとうございましたm(_ _)m もしまた質問したい事が出てきましたら、tatsu99さんにご質問させていただいてもよろしいでしょうか? ワガママを言いますと、メールやスカイプでのご質問は無理でしょうか?^^; その時はもちろん有料でも構いません。一度ご検討いただけましたら嬉しく思います。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>質問1) >選択された年齢の結果をPresonクラスではなくて、別のクラス、例えばAnimalクラスで表示させたい時は、 >Animalクラスにこれまでのロジックを書く事は合っていますか? それでOKです。 ただし、 <%= form_tag {:controller = > animals,:action => :age} do %> はエラーになりますので <%= form_tag({:controller => :animals,:action => :age}) do %> としてください。 >質問2)<%= submit_tag "表示する"%> #submit_tagが使えない場合。 >show.htmlではすでにbutton_toが使われていて、 >submit_tagが使えない時はどのように書くべきでしょうか? こちらでは、使えました。 <%= @preson.name %> <%= form_tag({:controller => :animals,:action => :age}) do %> <%= select("form","age", (1..100))%> <%= submit_tag "表示する"%> ・・・ここへ記述 <% end %> <%= button_to "次へ進む" , add_animal_path, :id => @preson %> では、だめでしょうか? 補足要求: こちらでは <%= button_to "次へ進む" , add_animal_path, :id => @preson %> はエラーになりまたので、とりあえず <%= button_to "次へ進む" , '/animals/test' %> としました。 <%= button_to "次へ進む" , add_animal_path, :id => @preson %> は、正しく動作していますか。 もし、正しく動作しているなら、animalsのコントローラとモデルはどのように作成されたのでしょうか。 その詳細を教えてください。 rails generate controller animals ・・・ rails generate scaffold animals ・・・・ rails generate model animals ・・・・ rake db:migrate 等のコマンドを使っていれば、 実行した手順も、詳細に教えてください

_rin
質問者

お礼

tatsu99様 _rinです。いつもありがとうございます。 <%= button_to "次へ進む" , add_animal_path, :id => @preson %> このコードではエラーが出ております。。 まずお詫びしたいのですが、 前回のご質問事項ではちょっと私の書き方が悪かったので、再度ご質問を記述させていただいてもよろしいでしょうか? 質問1)presons/showページの選択された年齢をsubmitボタンを押さずに、 animals/indexで引き継ぎたい。 ================================== 実装したいイメージのサイトがありましたので、urlを書かせていただきます。 http://item.rakuten.co.jp/gekiyasukaguya/chair-panda?s-id=browsehist_top_normal ここでは、注文個数を入力して、注文ボタンを押すと、次のページへデータが引き継がれています。 ================================== このサイトのような感じで、 仮にbutton_toでは別のaddアクションに飛ぶ命令を書いたとして、 form_tagではageアクションが指定されていますが、 submitボタンを押さずに、次のページへデータを引き継ぐ方法はございますか? 上記のサイトでは、 hiddenが使われていて、hidden_fieldとform_tagの組み合わせができるのかなと 色々調べておりましたが、難しくてギブアップです。。^^; 再度ご教授いただければ嬉しいです。いつもすみませんm(_ _)m ==================== views/prseons/show.html ==================== <%= @preson.name %> <%= form_tag({:controller => :animals,:action => :age}) do %> <%= select("form","age", (1..100))%> <% end %> <%= button_to "次へ進む" , ?? %>       

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

>引数をmodelに渡して、ロジックを書いた場合、 >よくこのエラーがでてきます。 >wrong number of arguments (0 for 1) >MVCの仕組みを理解したいので書き方を教えていただければ嬉しいです。 当初、モデルを使用しないとのことでしたので、モデルを使用したPresonクラスについては、深く立ち入らないことを前提に回答しましたが、モデルを使用するということになりましたので、その趣旨で回答します。 モデルを使用する場合は、当然データベースも必要になりますので、SQlite(Rails3.0の推奨DB)等のDBをインストールしておいてください。その後、モデルの生成は rails generate modelコマンドで行なってください。このコマンドを実行することにより、 class Preson < ActiveRecord::Base end のようなクラスが作成されます。これは、ActiveRecord::Baseを継承したPresonクラスになります。 これが、本来のモデルの使い方になります。今回、あなたが、作成しているクラスは、 ActiveRecord::Baseを継承していませんので、今後は、rails generate modelコマンドで モデルクラスを生成するようにしてください。 ---------------------------------------- 話は、変わって、今回のwrong number of arguments (0 for 1) をどうやってとるかということですが、 解決方法は2通りです。 1番目は、モデルに引数を渡さない方法をとる。 つまり、 @preson.age = params[:form][:age] とすることです。(これは私が#2で回答した方法) 2番目の方法は、Presonクラスが @preson.age(params[:form][:age])と書く記述を受け入れるようにPresonクラスを 改造する方法。 但し、これを行なうと、View側で@preson.ageと記述して年齢を参照することが できなくなります。 また、そのようにクラスを改造することに意味があるかというと、本末転倒のような気もしますが、 一応以下に、記述しておきます。 ==================== presons_controller.rb ==================== 変更なし ==================== model/Preson.rb ==================== class Preson def age(parames) @age2 = parames end attr_reader :age2 end ==================== views/index.html ==================== <p> <% @msg="あなたが選択した年齢は#{@preson.age2}です。" if @preson.age2 %> <%= @msg %> </p>

_rin
質問者

お礼

tatsu99様 _rinです。いつもご回答ありがとうございます。 出来ました!ありがとうございます。 インスタンス変数をクラスにメンバ登録して使う方法が分かってきました。 すごく分かりやすい説明なので、tatsu99さんのお陰で理解できました。とても嬉しいです^^ 差し支えなければ、教えていただいたコードで応用をしてみたいので、またご教授いただければ嬉しく思います^^ 実装したい事:@presons/showページから別のクラスのindex.htmlページで年齢を出力する。 質問1) 選択された年齢の結果をPresonクラスではなくて、別のクラス、例えばAnimalクラスで表示させたい時は、 Animalクラスにこれまでのロジックを書く事は合っていますか? 別のやり方がございましたら、教えていただきたく思います。 ======================================== views:presons/show.html   #presons/showページから animals/index.html に結果を出力 ======================================== <%= form_tag {:controller = > animals,:action => :age} do %> <%= select("form","age", (1..100))%> <%= submit_tag "表示する"%> <% end %> 質問2)<%= submit_tag "表示する"%> #submit_tagが使えない場合。 show.htmlではすでにbutton_toが使われていて、 submit_tagが使えない時はどのように書くべきでしょうか? ================= views:presons/show.html    ================= <%= @preson.name %> <%= form_tag {:controller = > animals,:action => :age} do %> <%= select("form","age", (1..100))%> <% end %> <%= button_to "次へ進む" , add_animal_path, :id => @preson %> --------------------------------------------------- 色々調べていたら、select_tagにurlを指定する方法があるようで、 以下のコードで試してみましたがエラーが出て上手く動きませんでした^^; シンプルな方法がございましたら、ぜひ教えてください。 <%= select_tag("form", "age", (1..10)), {:onchange => remote_function( :url => { :controller => "animals", :action => "age" }) } %> <% end %> 何度もお手数をお掛けいたしますが、どうぞよろしくお願い致しますm(_ _)m

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

>NoMethodError in PresonsController#age >undefined method `age=' >とエラーがでました^^; class Presonのメンバーにageが登録されていないのが原因です。 class Preson attr_accessor :age end のようにしてください。

_rin
質問者

お礼

tatsu99様 _rinです。早速のご回答ありがとうございます。 やっと表示されました!嬉しいです。ありがとうございました! またお手すきの時がございましたら、引数の場合の書き方も教えていただければ幸いです。 引数をmodelに渡して、ロジックを書いた場合、 よくこのエラーがでてきます。 wrong number of arguments (0 for 1) MVCの仕組みを理解したいので書き方を教えていただければ嬉しいです。 ==================== presons_controller.rb ==================== def age @preson = Preson.new @preson.age(params[:form][:age]) render :action => 'index' end ==================== model/Preson.rb ==================== def age(params) age = params end ==================== views/index.html ==================== <p> <% @msg="あなたが選択した年齢は#{@preson.age}です。" if @preson.age %> <%= @msg %> </p> ↓ ==================== ArgumentError wrong number of arguments (0 for 1) ==================== どうぞよろしくお願い致しますm(_ _)m

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

#1です。 >「@presonはPresonクラスのインスタンスとして定義するのか」とございましたが、 >ちょっと言葉では理解ができなくて、その場合のコードもご教授いただければ嬉しいです。 def index @preson = Preson.new ・・・(1)これが、Presonクラスのインスタンスとして生成した@preson end def age @preson = params[:form][:age] ・・・(2)これがStringクラスのインスタンスとして生成した@preson redirect_to :action => 'index' end (1)と(2)の@presonは、同じ変数名を使用していながら、データを内部に格納する方法がまったく異なります。 (2)の場合は、@preson自体に選択した年齢(20等)が格納されていますので、#1で回答した方法で表示が可能です。 (1)の方法を使用するなら、以下のようになります。 この場合、クラス名:Presonが既に(どこかで)定義されているはずです。 そして、年齢を示すメンバ名が定義されているはずです。(今回ageとして定義されているものとします) def index @preson = Preson.new ・・・Presonクラスのインスタンスとして生成 end def age @preson = Preson.New ・・・Presonクラスのインスタンスとして生成 @preson.age = params[:form][:age] ・・・@presonのメンバ(age)に年齢を設定 redirect_to :action => 'index' end <p> <% @msg="あなたが選択した年齢は#{@preson.age}です。" if @preson.age %> ・・・@preson.pageを参照する <%= @msg %> </p>

_rin
質問者

お礼

tatsu99様 _rinです。ご回答ありがとうございます。 すごく分かりやすいです。ありがとうございます。インスタンス変数に格納される違いが理解できました^^ @presonをPresonクラスのインスタンスとして使用する(2)の方法でやってみましたが、 ====================== NoMethodError in PresonsController#age undefined method `age=' とエラーがでました^^; ====================== 色々、試行錯誤してみましたが、解決できずに再度質問させていただきます。 質問1) (2)の手順でundefined method `age=' このエラーがでる原因はどこでしょうか? ちなみに、この時のmodel/Preson.rbは以下の2行だけです。 class Preson end 質問2) modelに params[:form][:age]を 引数として渡した場合、 それをviewsに渡す方法も教えてください。 paramsが絡んだ場合のMVCの仕組みも理解したくて、、質問ばかりですみません。 質問2)の試してみたコードです。 ====================== presons_controller.rb ====================== def index @preson = Preson.new end def age @preson = Preson.new @preson = Preson.age(params[:form][:age].to_i) redirect_to :action => 'index' end ====================== model/preson.rb ====================== class Preson def self.age(params) @preson = params.to_i #ここにプルボタンで選択された「20」はきてます end ==================== views:presons/index.html ==================== <% @msg="あなたが選択した年齢は#{@preson}です。" if @preson %> <%= @msg %> # ここに「20」はきません、、 ご教授の程、どうぞよろしくお願い申し上げますm( _ _ )m

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

@presonはPresonクラスのインスタンスとして、定義するのか それとも、単なる、年齢を格納する文字列として、定義するのかが、不明でしたので、 単なる、年齢を格納する文字列として定義することにします。 その前提で、以下のように、ソースを修正してください。 ==================== presons_controller.rb ==================== def index #@preson = Preson.new ・・・この行をコメントアウトする end def age @preson = params[:form][:age] #redirect_to :action => 'index'・・・・この行をコメントアウトする render :action => 'index' ・・・・・この行を追加する end ==================== views:presons/index.html ==================== <%= form_tag :action => :age do %> <%= select("form","age", (1..100))%> <%= submit_tag "表示する"%> <% end %> ・・・以下の行を追加する。 <p> <% @msg="あなたが選択した年齢は#{@preson}です。" if @preson %> <%= @msg %> </p>

_rin
質問者

お礼

tatsu99様 表示されました!ありがとうございます! <%= @msg %>で出力するのですね。 ご丁寧に解りやすく書いていただいて本当にありがとうございました。 もしご迷惑でなければ、もう1点お尋ねしたいのですが 「@presonはPresonクラスのインスタンスとして定義するのか」とございましたが、 ちょっと言葉では理解ができなくて、その場合のコードもご教授いただければ嬉しいです。 どうぞよろしくお願い申し上げます。

関連するQ&A