トップページphp
1001コメント368KB

【RoR】Ruby on Rails Part13

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2011/11/04(金) 17:06:24.32ID:???
■前
【Ruby】Ruby on Rails Part12
http://hibari.2ch.net/test/read.cgi/php/1311050686/

■参考サイト
<英語>
本家:http://rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
http://ruby-toolbox.com/
http://rubygems.org/
http://agilewebdevelopment.com/plugins/top_rated

<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/

http://twitter.com/dhh
http://www.loudthinking.com/
0954nobodyさん2012/02/15(水) 13:44:35.77ID:???
>>953
railsじゃなくてjavascript
0955nobodyさん2012/02/15(水) 14:26:44.14ID:RCBLEB3T
>>953
Railsだけでやりたいなら

form_tag "/" , :remote => true do

ほげほげ

submit_tag "オッケー" , :disable_with => "ロック" , :onClick => "return false;"

これで出来ると思うけど、スマートじゃないしおとなしくJS使うべき
0956nobodyさん2012/02/15(水) 16:24:52.48ID:???
JavaScript - 戻るボタン禁止
http://tk-factory.net/wordpress/?p=400
http://www.javable.jp/blog/129.html
http://jswiki.bugbearr.jp/?%E7%9B%AE%E7%9A%84%E5%88%A5%2F%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%2F%E6%88%BB%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3%E7%A6%81%E6%AD%A2
0957nobodyさん2012/02/15(水) 18:23:07.04ID:???
【ウェブアプリケーションという不幸 】

現在、多くのプログラマ(素人)がウェブアプリケーションというものがベストな正しい方向だと勘違いしている。
ソフトウェアの作るにおいてそのアプリケーションに応じた状態遷移を実装するというのは基本中の基本である。
その点においてウエブブラウザというある状態遷移が実装されているアプリケーションの上に
また別のアプリケーションを実装するのは論外である。
そこまでするなら普通にアプリケーションを実装してダウンロードして使ってもらえばいいのである。
ウェブアプリケーションとは虚構にしか他ならない。
ウェブアプリケーションを作ろうとしているあなた。
今すぐ普通のアプリケーションとし設計し始めてはいかがだろう。
そうすればきっと後悔しないですむ。

HTMLやHTTPを悪者にはしていない。
TCP/IPができあがり、その応用として、ファイルを送ったりするようになった。
ファイルの中身のテキストにデータ構造をもたせ、それはつまりツリー構造なわけだが
その実装としてのハイパーテキスト、つまりHTMLという送る側と送られる側で決め事(プロトコル)
をつくり、画像や音楽など表現の幅を広げることは当然の成り行きだっただろう。
そして、その送る側としてのHTMLファイルサーバ、つまりWebサーバ、送られる側としてのプロトコルの解釈・表示系としての
ブラウザというアプリケーション。
ここまではいい。
だが、そこから先が素人の発想というか、いそがばまわれを忘れた者の愚かな発想。
つまりブラウザ上で、アプリケーションを動かすという発想なのである。
ブラウザというのは、おくられてきたステートレスな通信内容の一瞬の表示手段でしかない。
つまりアプリケーションのためのひとつのパーツなのである。
Windowsでいえば、コントロールのひとつ。(実際WebBrowserというコントロールがある。)
JavaならWebClietnだ(これは、ブラウザではないが。)。
包含関係が逆なのである。
ブラウザ上にアプリケーションを作るのは愚かなブームである。
0958nobodyさん2012/02/15(水) 18:27:47.97ID:???
>>957
そうだな、それと同じくしてOS上にアプリケーションを作るのも愚かなブームだ。
0959nobodyさん2012/02/15(水) 18:45:47.81ID:???
何でもかんでもHTTPの上でってのは気持ち悪いなとは思うわ。
0960nobodyさん2012/02/15(水) 23:46:35.01ID:???
HTTPがお手軽で実装事例も多いんだからしょうがない
CORBA/IIOPとか考えたくもないだろ?w
0961nobodyさん2012/02/16(木) 03:21:35.33ID:gUT9ymRS
質問させてください

2ちゃんの様な掲示板を作る時に スレッドのレス一覧の下に書き込みフォームを作るにはどうしたらいいのでしょうか?
scaffoldではnewアクションで空のオブジェクトを作らないといけませんが、
レスするかどうかはわからないのに、レス一覧顔面を見るたびに空のオブジェクトを作るのはもちろんナンセンスですよね?
0962nobodyさん2012/02/16(木) 03:41:59.23ID:???
http://www.tohoho-web.com/html/form.htm
0963nobodyさん2012/02/16(木) 07:15:32.07ID:???
twitterのような大量アクセスサイトでもフレームワークのformクラスは使ってたのかな。
0964nobodyさん2012/02/16(木) 09:05:15.33ID:???
indexではモデルに関連しないform_tagにしといて、new.htmlに飛ばしてそこでモデルと結びつけるとかは?
思いつきだけど
0965nobodyさん2012/02/16(木) 09:07:41.24ID:EHmdvyte
indexページからいきなりpostしてもいいのよ。
0966nobodyさん2012/02/16(木) 10:22:54.95ID:???
別に空のオブジェクト作ってもいいじゃないかと思うけど
0967nobodyさん2012/02/16(木) 11:45:27.27ID:???
twitter等で一覧を出すコスト >>>>>>>>>>>>> 空オブジェクト作るコスト
0968nobodyさん2012/02/16(木) 11:51:31.84ID:gUT9ymRS
色んな方々、アドバイスありがとうございます
確かに普通にhtmlでフォームを作ればできる感じはしますね
あと空のオブジェクトを作る方法でもできる気はします(多分)

でも自分の勉強がメインなので、の空のオブジェクトを作らない かつ ビューヘルパーを使ってやりたいなぁ、と思うので
form_tag等を使う方法で挑戦してみようかと思います
0969nobodyさん2012/02/16(木) 12:40:37.09ID:gUT9ymRS
連投ですみません

結局目的のform_tagを使ってcreateアクションにpostして掲示板のレスを作ることには成功しました
ただ<%= form_tag({:controller => 'posts',:action=> 'create'}) do %> の様に指定したら
routing error(no route)が返って来てしまいました

結果的には強引な感じはしますが、urlヘルパーを使って<%= form_tag(topic_posts_path(@topic),:method => 'post') do %>
の様に指定したらうまく書き込みができました ネストされたルーティングを使っているため上の様になりました

{:controller => 'posts',:action=> 'create'}の様なコントローラとアクションの指定では、なぜうまく行かないのでしょうか?
rake routes するとちゃんと以下のようにはなっています
POST /topics/:topic_id/posts(.:format) {:action=>"create", :controller=>"posts"}
0970nobodyさん2012/02/16(木) 13:29:38.29ID:???
:topic_id => @topic.id を入れてないから。
どこで覚えたか知らないが、もうその書き方古い。Rails 1系の時はそれしか無かったけど。

form_for @post do |f|

でいける。@postをきちんと作ってれば。
0971nobodyさん2012/02/16(木) 13:47:21.30ID:???
>>969
ID付きって事は更新用、scaffoldでいうところのupdateでしょ
create相当のことやるんならIDなしroute

というかscaffoldから始めたら?
0972nobodyさん2012/02/16(木) 14:47:58.94ID:???
scaffold 作って、index と new を合体させればおk
で済む話では?
0973nobodyさん2012/02/16(木) 17:10:38.51ID:xHJ9ppvJ
質問お願いします。
今回Railsで初めてアプリを作っていて、ほぼ完成したので
初めてproduction環境でサーバを起動して動かしてみたのですが、
ログに以下のように表示されます。

cache: [GET /] miss
cache: [GET /assets/application.css] miss, store
cache: [GET /assets/img1.png] stale, invalid, store
cache: [GET /assets/img2.png] stale, valid, store
...

これは、どこかに何か問題があるのでしょうか?
そしてmiss, stale, invalid, store はそれぞれ何を意味をしているのでしょうか?
辞書などでstaleを調べると「新鮮でない」とかですけど、ファイルによって
stale, invalid
stale, valid
だったりして、何が良くて何がダメなのかいまいちわかりません。

Rails3.2.1でアセットをプリコンパイルして
production.rbの設定は以下のようにしています。
config.serve_static_assets = true
config.assets.compress = true
config.assets.compile = true
config.assets.digest = false
0974nobodyさん2012/02/16(木) 18:14:17.54ID:???
production.rb の設定変えてるんだから、自分のやってる事は分かると思うけど。
0975nobodyさん2012/02/16(木) 21:22:21.58ID:???
>>974
デフォルトではエラーがでたので検索で調べたら設定があることを知って
今のところ、弄ってなんとか動く設定にしただけという感じです。
production環境での正常なログとは、本来どんな感じなのでしょうか?
0976nobodyさん2012/02/16(木) 21:56:18.65ID:???
どなたかお助けください

2つのモデル(テーブル)
wokerとphoneがあります(両方scaffoldで作成)

workerモデルには has_one: phone
phoneモデルには belongs_to: woker
accepts_nested_attributes_for : woker

のようにしアソシエーションおよびネストを組んであります。
もちろんphoneモデルにはwoker_idのカラムがあり、telという電話番号(tel)のstringカラムもあります。

そこでview/woker/edit.html.erb
にアソシエートしたphone.tel を表示して、そこからテーブルをまたいでphoneの関連レコードも一緒に更新しようとしています。
その際に下記のようにfields_forを使うと、アソシエート先のカラムの表示(中身のデータも)はきちんとされます。
しかし、更新ボタンを押してもアソシエート先のphone.telへ変更が反映されません。一体なぜでしょうか?

<%= form_for @worker, :url => { :action => "create" } do |worker_form| %>
<%= worker_form.text_field :name %>
<%= fields_for @worker.phone do |phone_form| %>
<%= phone_form.text_field :tel %>
<% end %>
<% end %>
0977nobodyさん2012/02/16(木) 22:21:31.19ID:DriUyt2H

http://vermelho.jugem.jp/?eid=119
0978nobodyさん2012/02/16(木) 22:52:33.55ID:???
>>976
まず設計がそもそも悪い。
なんでworker has_one phoneなの?
一つ以上持ってたら?
普通は workerのカラムに phoneをいくつか持たせると思う。

それは置いといて、問題の件は
nested_attributes_for と fields_for の使い方間違ってる(nested_attributes_for 付けるモデルと、fields_for の引数)。
ちゃんと調べ直した方が良い。
0979nobodyさん2012/02/16(木) 22:59:50.92ID:???
>>978
返信ありがとうございます。
Railsの書籍を3つほど持っているのですが残念ながら、
フォームで関連モデル先のカラム内容までを更新する方法が記載されていません。

試行錯誤しながらネットで調べていたところ、ネストを使えば良いみたいなことが書いてあったので、
お試し的にwork has one phoneという形でテストしているところです。

書籍に載っていなかったことを実現したいので
何をキーワードに調べたら良いものか分からずにいます。

知識不足ですみません。
0980nobodyさん2012/02/16(木) 23:02:33.32ID:???
>>976のfields_forを修正しました

<%= form_for @worker, :url => { :action => "create" } do |worker_form| %>
<%= worker_form.text_field :name %>
<%= fields_for @worker_form.phone do |phone_form| %>
<%= phone_form.text_field :tel %>
<% end %>
<% end %>
0981nobodyさん2012/02/17(金) 07:33:58.84ID:???
同じモデルのインスタンス同士でhas_manyのような関係を記述するにはどうしたらいいの?

掲示板の投稿記事みたいなもので、関連項目をつけたいんだけど

同じArticleモデル内でで

親子丼 →関連項目 : カツ丼、うな丼、卵とじ
カツ丼 →関連項目 : うな丼、親子丼、カツカレー

こんな風にしたい
0982nobodyさん2012/02/17(金) 07:43:13.75ID:???
>>979
nested_attributes_for をググるだけで出てくる。
コントローラでbuildするのも忘れないように。
0983nobodyさん2012/02/17(金) 07:46:51.55ID:???
>>981
has_many :through で繋げる
0984nobodyさん2012/02/17(金) 11:41:41.03ID:???
http://wiki.usagee.co.jp/ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active%20Record%20Associations
自己結合(Self Joins)
0985nobodyさん2012/02/17(金) 12:18:35.23ID:???
自己参照結合
http://japan.zdnet.com/blog/yoshimi/2007/11/22/entry_27016437/
0986nobodyさん2012/02/17(金) 14:38:44.56ID:???
ちょっとrails的なパターン?について教えてください

コントローラーで込み入った処理をしたいんですが
分割したメソッドはどこに置くべきでしょうか
コントローラー内でよい?ヘルパー?
その場合はrspecでどう試験できますか?

class HogeController
 def index
  @foo = bar
 end

 def bar
  "BAR"
 end
end

describe HogeController do
 describe :bar do
  it "returns 'BAR'" do
   (barの戻り値).should eq("BAR")
  end
 end
end
0987nobodyさん2012/02/17(金) 16:22:54.21ID:???
その処理の内容による、としか
・まずはModelに突っ込めないか考える
・完全独立ならlibの下。もっと突き抜ければgem化
てな感じかと
09889862012/02/17(金) 18:00:46.78ID:???
>>987
ありがとうございます、でもそこまでは込み入ってないです
ifの条件だけ切り出して、
個別にテストできたらなと考えています
Modelはありません
0989nobodyさん2012/02/17(金) 20:13:46.89ID:2+La73VF
コントローラなら、
* 最終的に所定のインスタンス変数がセットされ、
* 適切なビューがレンダリングされるか、
がテストできていれば、分割した個々のメソッドをテストする必要は
ないと思うんだけど。
0990nobodyさん2012/02/17(金) 22:13:19.19ID:???
ルーティングについての質問です。

よくネットサービスを見ていると
アクション名やパラメータなどはURLに表示されず

/?token=g6kuo396hbdwiou8b6e38001s

のようにワンタイムセッションのようなもので
画面の遷移を行っているのを見かけます。

railsの場合だと
hoge.com/users/1/show
だと数字の部分をカウントアップしていくだけで
他レコードの情報まで表示して取り出せてしまいます。

これを上に書いたようにワンタイムセッションのように遷移先を管理したり、
URLのコントローラー部分やアクション部分を偽装する方法があれば教えてください。
0991nobodyさん2012/02/17(金) 22:40:10.70ID:???
他のレコードまで見えても別に良いものもある。そういうのは別に構わない。

もちろん他のデータが見えてはいけないものもある。TwitterのDみたいに。
それはデータ引っ張ってくる段階、コントローラ側で弾く。

ワンタイムトークンが必要なものはそのように実装する。
ただCSRF対策とかはもう入ってるから、GETに使うのは結構限られる。
0992nobodyさん2012/02/17(金) 22:42:00.17ID:???
id連番が嫌なら、idがURLに出ないように実装する。
0993nobodyさん2012/02/17(金) 23:28:42.83ID:???
>>992
連番が嫌なら出ないようにするって

・idカラム(数字)の代わりにurlカラム(IDの代わりの用途の文字列)を用意する

・ルーティングの設定でURLが見えないようにする

って意味ですか?
0994nobodyさん2012/02/17(金) 23:34:03.69ID:???
>>991
例えば、とあるデータサイトを作ったとして
訪問者(プログラマ)にサイト内クローラーを作られ情報を自動収集されたくない場合は
それなりのルーティングを組む必要がありそうです。
何か参考意見はありませんか?
0995nobodyさん2012/02/17(金) 23:34:52.52ID:???
どちらにしても、閲覧権限のないデータを弾く必要があるのはidだろうが代わりの項目だろうが変わらないけど
0996nobodyさん2012/02/18(土) 00:00:06.15ID:???
require 'digest/md5'
hoge = Digest::MD5.new.update('aiueo')
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2FMD5%B4%D8%BF%F4%A4%C7%A5%CF%A5%C3%A5%B7%A5%E5%C3%CD%C0%B8%C0%AE
http://www.ruby-lang.org/ja/old-man/html/Digest_MD5.html
0997nobodyさん2012/02/18(土) 00:03:25.87ID:xUPBYEV4
Rails3のセッションをクッキーで保存ていうのがよくわからないんですが
サーバー側には一切データはないってこと?

だとすると、そのクッキー(セッション)が正当なものだって判断はどうしてるの?
0998nobodyさん2012/02/18(土) 00:07:24.44ID:FrtCmEYT
railsのクッキーとセッションについてまとめ - おもしろWEBサービス開発日記
クッキーもセッションも、ブラウザにデータを保存させる仕組み。
http://d.hatena.ne.jp/willnet/20080531/1212239850
0999nobodyさん2012/02/18(土) 00:34:37.37ID:FrtCmEYT
【RoR】Ruby on Rails Part14
http://kohada.2ch.net/test/read.cgi/php/1329492840/l50
1000nobodyさん2012/02/18(土) 00:35:11.19ID:FrtCmEYT
http://toro.2ch.net/test/read.cgi/hosting/1329378677/
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。