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

【RoR】Ruby on Rails Part16

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2013/01/31(木) 08:07:31.27ID:GGHiBszv
前
http://kohada.2ch.net/test/read.cgi/php/1341589839/
http://unkar.org/r/php/1341589839

■参考サイト
<英語>
本家: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://doc.ruby-lang.org/ja/1.9.3/doc/index.html
0728nobodyさん2013/09/09(月) 20:05:29.13ID:???
>>725
bundler使え
0729nobodyさん2013/09/09(月) 20:46:13.15ID:???
>>714
>>721
ありがとうございます。

ただし>>721だとコンパイル通りますか?
0730nobodyさん2013/09/09(月) 20:52:49.76ID:???
すいません、コンパイルは通りましたが、難読化されませんでした

after_filter :uglifyはいいとして、あとのオプションは only: :js_no_actionでいいのでしょうか?
0731nobodyさん2013/09/09(月) 21:02:34.36ID:???
>>727
usersテーブルにcountry_idやcity_idを追加したとして、
多言語化はここの(6)を参考に
http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/
Country#name がlocaleに適切なカラム(name_jaやname_en)を返すようにする。

デフォルトの選択は
@countries = Country.all.map{ |country| [country.name, country.id] }
select_tag(:country, options_for_select(@countries, selected: @user.country.id))
こうなるんじゃないかな

options_for_selectに渡す@countriesのところはもっと綺麗に書けるかもしれない。
0732nobodyさん2013/09/09(月) 21:50:15.35ID:???
acts_as_commentable_with_thread などのgemには
誰が投稿したか?のuser_idのカラムが存在します

もしuser制を実装せずに誰でも投稿できるようにするにはどうすればいいのでしょうか?

まずモデルでuser(そもそも存在しない)とcommentsを関連づけないのか?

それともuserモデルはダミーで作り
2ユーザー(adminとguest)のみ作っておいて関連づけるのか?
0733nobodyさん2013/09/09(月) 21:50:47.16ID:???
>>730
productionと同じ動作のはずだよ。つまり難読化されない。
どうしても難読化したいなら、jsmin、yui-compressor、sqwish、closure、あとsassのやつとか
コンプレッサーのライブラリがあるみたいなんで、中には難読化してくれるものもあるかもしれない。

only: :js_no_actionのところは通常のHTMLにもUglifier.compileすると
エラーになるからjsを返すアクションに限定してフィルタをかけてという意味
もし同じアクションで複数のフォーマットを返すことがあるなら
response.content_typeでjs以外の場合はcompileをスキップさせて。
0734nobodyさん2013/09/09(月) 22:11:21.80ID:???
>>733
すいません、難読化の定義が曖昧だったようですが

・コメントが削除される
・空白やスペースが極力削除される
・変数名が一文字になる

というのを難読化と呼びました

productionで.jsをコンパイルしたら、確かに上の3つは実施されておりますが、
hoge.html.erbに書いたjsに対してそれを行いたかったのです。



application_controller.rbに、uglifyメソッドを定義して、
目的のhtml.erbをレンダリングするcontrollerにafter_filter :uglify, only: :js_no_actionを書きましたが、
erbに書いたjavascriptには変化はありませんでした


ちなみに、only: :js_no_actionって、rubyの文法的には、:js_no_actionはシンボルであり何かの引数だと思いますが
only:はなんなのでしょうか?
0735nobodyさん2013/09/09(月) 22:14:14.11ID:p6whV7Wi
Ruby 1.9から使える、シンボルをキーとしたハッシュリテラル記法
only: :js_no_action と :only => :js_no_action は等価。
0736nobodyさん2013/09/09(月) 22:46:44.36ID:???
ごめん。productionで変数は短縮されないと思いこんでたけど確認したら短縮されてた。

>>721では変数全部じゃなくてfunctionの中の変数だけ短縮されるみたいだ。
productionでも同じ動作かは確認してない。

https://github.com/lautis/uglifier
ここにuglifierのオプションが書いてあるんだけど
function外の変数を短縮する方法が見つけられなかった
0737nobodyさん2013/09/09(月) 23:24:23.12ID:???
>>735
ありがとうございます。

>>736
ありがとうございました。

今のところfunctionの中でも短縮化化されてないようです。
後出しですいませんが、今回やりたいのは、hoge.html.erbの中でrender :partialしているfuga.html.erbでした。
それだと、hoge_controllerにafter_filter書くだけではダメなのでしょうか・・・
0738nobodyさん2013/09/09(月) 23:57:44.96ID:???
>>709 のerbに書いたjsってfuga.js.erbじゃなくて、
fuga.html.erbにjavascriptが書いてあるってこと?
もしそうなら、俺の書いた事は見当違いかも・・・
0739nobodyさん2013/09/10(火) 00:52:16.17ID:PCxtq6wU
>>731
仮眠終了しました(笑)
今から取り組みます。

この板は親切過ぎて、甘えてしまっていますが、どうか宜しくお願い致します。
0740nobodyさん2013/09/10(火) 05:04:34.43ID:PCxtq6wU
>>731
明日は、先ほどの例で、都道府県を選択したら、
市町村のメニューそのものが表示されるようにしてみたいと思います(最初は表示されていない)。

ありがとうございました。
0741nobodyさん2013/09/10(火) 09:56:44.36ID:???
>>737
もし、HTMLの中にjsがベタ書きしてあるのなら、

ヘルパーに追加
def ugly_javascript(&code)
javascript_tag(Uglifier.compile(capture(&code)))
end

ビュー
<%= ugly_javascript do %>
function nanika(hoge){
alert(hoge);
var fuga = "fuga";
alert(fuga);
}
var dame = "dame")
nanika(dame);
<% end %>

これでこう出力された
<script>
//<![CDATA[
function nanika(a){alert(a);var n="fuga";alert(n)}var dame="dame";nanika(dame);
//]]>
</script>
0742nobodyさん2013/09/11(水) 08:20:27.07ID:???
>>738
>>741
ありがとうございました!
0743nobodyさん2013/09/11(水) 19:42:09.90ID:K4ZJ810j
>>727
のサイトさんの、
「 _todoufuken_select.html.erb 」は、

$("#jusho_shichoson_id").html (省略)・・・
<%= f.select(:shichoson_id, (省略)・・・

この2行で、この並びで問題ないのでしょうか?
(rails4では、find(:all)が使えないようなので、whereで対応しました。)
0744nobodyさん2013/09/11(水) 19:51:08.09ID:???
ざっとしか見てないけど
$("#jusho_shichoson_id").html... は
_todoufuken_select.html.erbじゃなくて、
todoufuken_select.html.erbの間違いだと思う。
つまり別ファイル。
0745nobodyさん2013/09/11(水) 20:10:37.43ID:7odvwZmt
スタートアップ企業で8年間Webの開発をしてみての反省点いろいろ - Masatomo Nakano Blog
独自フレームワークはやめよう
6. サーバ周りの人材をしっかり確保しよう
b.hatena.ne.jp/entry/blog.madoro.org/mn/84
0746あ2013/09/11(水) 20:14:42.56ID:7odvwZmt
あと先に書いたように、既存のフレームワークを利用しないので、「フレームワーク固有の知識」みたいなのが要求されなくて良いです。
ほら、結構重厚なフレームワークとか賢いフレームワークとかって、使いこなすためには一定の学習量が必要じゃないですか? そのコストがほぼ無い。
moznion.hatenadiary.com/entry/2013/09/11/163554
0747nobodyさん2013/09/11(水) 20:46:18.97ID:???
あー >>744 は忘れて。

$("#jusho_shichoson_id").html... は
todoufuken_select.js.erb に書くっぽい。
0748あ2013/09/11(水) 20:47:42.52ID:7odvwZmt
外の資源(ドキュメント/本/Google検索)が使えないので自前ですべて教育をしなくてはならない。
また、独自であるが故に、そのフレームワーク等の経験者を採用することもできない。
新しく入った人は常に0からのスタートになる。
blog.madoro.org/mn/84
0749nobodyさん2013/09/11(水) 22:10:13.17ID:K4ZJ810j
>>744 >>747
いつも?ありがとうございます。
jsファイルのことですね!!やってみます。

使えるようになるまであと数日かかりそうな悪寒はしますが、やってみます。
素人にとって、find(:all)の廃止から既に大きなトラップでした^^;
0750あ2013/09/12(木) 10:10:38.30ID:Jrvdbuq2
自分でサーバ立てるのってなんか楽しそうだしスゴそうだよね?
サーバ立てるのなんてちょっとパソコンに詳しければ簡単にできるんでしょ?
ハードウェアの多重化なんて必要?
企業で使うとかじゃなく個人的に細々と立てたサーバが攻撃されることなんて滅多にないよね?
攻撃が来るって言ったって大した数じゃないんでしょ?
攻撃されたって大したことは起きないんでしょ?
b.hatena.ne.jp/entry/tmaeda.s45.xrea.com/20041101.html
 
0751nobodyさん2013/09/12(木) 19:58:34.11ID:???
sessionにデータが格納されていた場合に、
対応する入力フォームのテキストボックスにそのデータをセットしたいのですが、
どのように書けば良いか分かりませんでしたので質問させてください。

params[session_name] = session[session_name] unless session[session_name].blank?

上記の記述でいけるかなと思いましたが、これではparamsにデータが入るだけで
入力フォームにデータをセットすることはできませんでした。

初歩的な質問で申し訳ありませんが、ご教示の程よろしくお願い致します。
0752nobodyさん2013/09/12(木) 20:14:24.50ID:???
ビューはどうなってるんでしょうか?

以下は一例です。
@nanka.session_name = session[session_name]
form_for @nanka do |f|
 f.text_field :session_name
07537512013/09/12(木) 20:28:31.44ID:???
>>752
ありがとうございます。

ビューは、752さんが記述されているようにform_forで記述していたため、

 @nanka.session_name = session[session_name]

または、

 @nanka[session_name] = session[session_name]

にてセッションデータをフォームへセットすることができました。

迅速な回答をいただき、大変助かりました。ありがとうございましたm(_ _)m
0754nobodyさん2013/09/12(木) 23:47:48.38ID:LD1hnGrg
f.text_field :hoge :value => piyo

こんなんでもいいかもね。 動くかわかんないけど
0755nobodyさん2013/09/13(金) 00:00:55.33ID:G88nyhWW
>>727
実はこのサイトの作業をまだやっているのですが、色々エラーに悩まされています。
http://itmemojp.blogspot.jp/2012/10/rails.html

当方、Rails4を使っているのですが、下記のコードで何でエラーが出るのかよく分かりません。
助けてください。


<div class="field">

<%= f.label :country_code %><br />

<%= f.collection_select(:country_code, Country.where("name_ja not ?", nil), :id, :name_ja) %><br />

</div>


Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL)' at line 1: SELECT `countries`.* FROM `countries` WHERE (name_ja not NULL)
0756nobodyさん2013/09/13(金) 00:12:36.95ID:piGo/Q/6
エラーをはったら?
0757nobodyさん2013/09/13(金) 00:14:44.78ID:piGo/Q/6
ごめん。張ってあったね
is がないんじゃね?
f.collection_select(:country_code, Country.where("name_ja is not ?", nil), :id, :name_ja)
0758nobodyさん2013/09/13(金) 00:34:21.23ID:G88nyhWW
>>757
ありがとうございます。
このリファレンスサイト様の該当箇所を見ると、こう書かれていたのですが、rails4で変わってしまったのでしょうか??

http://railsdoc.com/references/where

>nilでないすべてのデータを取得
>Page.where("title not ?", nil)
># SELECT "pages".* FROM "pages" WHERE (title not NULL)
0759nobodyさん2013/09/13(金) 01:01:50.13ID:iGb+EzAg
そこ、Ruby上は文字列定数として書かれていて、Rubyサイドでは解釈されてない。
SQL文の文法エラーだから、Railsのバージョン(3か4か)は関係ない。
0760nobodyさん2013/09/13(金) 01:08:15.41ID:G88nyhWW
>>759
ありがとうございます。
<%= f.collection_select(:country_code, Country.where("name_ja not ?", nil), :id, :name_ja) %><br />

"name_ja not ?" を name_ja ? にすれば良いということでしょうか?
すみません、勉強不足です。
0761nobodyさん2013/09/13(金) 03:12:20.81ID:G88nyhWW
皆様のおかげでcollection_selectコンボが作動できました。
>>760については、『Couontry.where(name_ja IS NOT NULL)』としました。
Rails4では、書き方にやや変化もあるようです。
http://xxxcaqui.hatenablog.com/entry/2013/02/25/015146

?絡みは難しそうということが、なんとなく感じたので、今後勉強したいと思います。
親選択肢が選択されたら、それに沿った子選択肢のselect欄が"(非表示から)表示"されるようにするには、どういった感じでjQueryを使うのが良いのでしょうか??
明日はそこらへんを研究してみます。

ありがとうございました。
0762nobodyさん2013/09/13(金) 08:33:46.23ID:???
>>758
そのサイトときどき間違ってる事があるんだけど
連絡先が書いてないんだよねぇ
0763nobodyさん2013/09/13(金) 18:38:29.94ID:G88nyhWW
>>762
そうなんですね!!

ざっと復習する時に使うに留めます。
他のソースでも確認しながらにします。
0764nobodyさん2013/09/13(金) 21:25:55.10ID:iGb+EzAg
>>762

@railsdoc へ
0765nobodyさん2013/09/14(土) 00:25:59.15ID:UYW4D9ML
ルート/hoge/index (GET)
ルート/hoge/edit (POST)

というサイト構成で

ルートにアクセスしてきても、hoge/indexに誘導したいんですが、

root :to => "hoge#index"

としたら、今度はhoge.html.erbの<form>に書いたpost先の"edit"が、
ルートからアクセスしたらルート/editになってしまいます。

どうすればいいのでしょうか?
0766nobodyさん2013/09/14(土) 01:16:07.01ID:JzP2wFkZ
index.html.erbとedit.html.erbがあるのかな?
hoge.html.erbはroutesにどういう風アクセスするようにかいてるの?

form_forかform_tagかわからんけどソースはってみて

想像だけど
hoges_controller.rbがあって
def index; end
def edit; end
がそれぞれ定義されてるんだよね?
それぞれがレンダリングするviewは
def index: endがindex.html.erb
def edit: endがedit.html.erbだよね?
0767nobodyさん2013/09/14(土) 01:17:05.89ID:JzP2wFkZ
form周りのソースはってくれ
0768nobodyさん2013/09/14(土) 23:30:54.97ID:???
form_tag を使って文字列 edit を指定しているか <form action="edit"> としてると予想。
form_for を使うか、form_tag(action: "edit") とすると良いんじゃないかな。

それから、resourcesで定義されるeditはgetの編集フォームだから後で混乱しそう。
PATCH update、POST create を定義した方が良いと思います。
0769nobodyさん2013/09/14(土) 23:59:40.02ID:???
>>766-768
すいません、先ほどからソースを用意してherokuに挙げてここに貼ろうとしてましたが、
>>768の一言で解決しました。

<%= form_tag("edit", :class => 'hage') do %>

これを↓にしたら万事解決しました。

<%= form_tag({:action => :edit}, :class => 'hage') do %>

ありがとうございました。
次からはもっと説明がうまくできるように頑張ります。
0770nobodyさん2013/09/15(日) 12:32:59.28ID:0/0Pk/FF
fields_forで複数個のdate_select作ってます。
上から順に日付けを入れていくのですが、日付が新しい順から入っているかエラーチェックしたいです。
field_forの前後の値を取得する方法が分かりません。
ご存知のかた教えてくれませんか。
0771nobodyさん2013/09/15(日) 14:17:39.44ID:???
JSでやればいいんでは
というかJSでやるしかない
0772nobodyさん2013/09/15(日) 14:44:21.93ID:???
>>771
ありがとうございます。
方法がないと分かってスッキリしました。
JSでイきます。
0773nobodyさん2013/09/15(日) 23:25:55.38ID:tO4b1j0o
DBにメーカーというテーブルとシリーズというテーブルがあります。
各メーカーにシリーズは複数あります

class Maker < ActiveRecord::Base
has_many :series
attr_accessible :name, :uniqueness => true, :null => false
end

class Series < ActiveRecord::Base
belongs_to :maker
attr_accessible :name, :uniqueness => true, :null => false
attr_accessible :maker_id, :null => true
end


Viewでユーザーが特定のメーカーを選んで、そのメーカーの文字列が来ます(例:「キリン」「サントリー」)。
んで、DBから、そのメーカーと一致するシリーズを全て検索したいんですが
ActiveRecordでどう書くのでしょうか?

普通にSQL書けば

SELECT series.name
FROM series
INNER JOIN maker ON series.maker_id = maker.id
WHERE maker.name = @引数


なんですが、ActiveRecordだと Series.include(:maker)から先がよく分かりません
そもそも外部キーの設定が間違っているのかもしれませんが・・・
0774nobodyさん2013/09/16(月) 00:05:06.99ID:???
>>773
Maker.where(name: 'hoge').series
でいいんじゃないの?
0775nobodyさん2013/09/16(月) 00:23:05.70ID:???
1. Series.joins(:maker).where("makers.name = ?", params[:name])
2. Maker.find_by_name(params[:name]).series

1は>>773に書いてあるSQLと同様のSQLを1回発行、2はmakerのあとにseriesを検索の2回。
上の方のレスにもあるけど、mysqlでは1だとorder("series.created_at")というふうに
where句と異なるテーブルを指定すると有効な(?)indexを参照できずデータ量によっては遅くなるみたい。

それから、attr_accessible じゃなくて、validatesじゃないでしょうか。
0776nobodyさん2013/09/16(月) 14:41:32.48ID:W80yAF/O
Rails4を使っています。

entries = Entry.select('discount email').where(:user_type => 4)

のようにして、ある条件を満たすEntryの一覧を取得したいのですが、
emailカラムの重複を排除するためdiscountを使うと、entriesにはemail以外のカラムの値が入っていません。
emailの重複を排除した上で他のカラムのデータも取得するためにはどうすればいいでしょうか?
0777nobodyさん2013/09/16(月) 15:16:08.80ID:???
>>776
select に他のカラム名も書けばいいんじゃないの?
0778nobodyさん2013/09/16(月) 15:29:56.10ID:???
レコード数が1000万近くになる場合、MySQL+Railsだと どのような構成が考えられますか
0779nobodyさん2013/09/16(月) 15:52:28.18ID:???
>>776
こうかな
Entry.where(user_type: 4).group(:email)
0780nobodyさん2013/09/16(月) 16:02:11.10ID:dRVqKGC7
MySQLだと間違って通ってしまうSQLになるね。
0781nobodyさん2013/09/16(月) 16:07:20.75ID:???
>>774
ありがとうございます。
ただ、*** NoMethodError Exception: undefined method `series' for #<ActiveRecord::Relation:0x4c1f610>と出ました・・・

>>775
ありがとうございます。
Rails4では、find_by_○○○は廃止されるらしいので、1を選びます。

:validatesは使ったことないのですが、どこのカラムに使うのでしょうか?
mass_assignmentで更新させたいカラムには、attr_accessibleをつける程度の認識だったのですが
0782nobodyさん2013/09/16(月) 16:14:46.07ID:???
>>781
あぁ、そうか
Maker.where(name: 'hoge').first.series
じゃないとだめだな
0783nobodyさん2013/09/16(月) 16:31:13.21ID:???
>>780
>>779で発行されるこれはSQL的に間違いということでしょうか?
SELECT `entriess`.* FROM `entriess` WHERE (created_at < '2013-08-16 07:19:29') GROUP BY email
SQLite3でも通るのは確認しました。
0784nobodyさん2013/09/16(月) 17:05:27.47ID:dRVqKGC7
>>783

標準SQLでは、GROUP BYを指定したときSELECTに書けるのは、
GROUP BYで指定したカラムもしくは集約関数のみに制限される。

だって、グループ化した中のどの行のカラムが代表に出てくるのか予測出来ないじゃん。
0785nobodyさん2013/09/16(月) 17:28:45.21ID:???
なるほど。
納得できる説明ありがとうございました。
0786nobodyさん2013/09/16(月) 17:48:38.61ID:???
>>781
validates :name, :uniqueness => true, :presence => true
こんな感じで validates はDBへの入力を制限したいときに使います。
>>773 のコードだとattr_accesibleのハッシュの引数は無視されて、
nameが重複または空のmakerやseriesを作ることが出来ちゃうんじゃないかな。

4.0が対象だけど、目を通しておくと良いと思います。
http://yoshitetsu.rackbox.net/active_record_validations.html
0787nobodyさん2013/09/16(月) 18:14:55.05ID:???
>>778
検索に使う項目にインデックス貼っておけばクエリキャッシュを勝手にやってくれるし、1000万件なら普通に使えるんじゃない?
重たくなればmemcached使えばいいし、普通にアプリケーションとデータベースのサーバを分離するだけでいいかと
0788nobodyさん2013/09/16(月) 18:39:18.91ID:???
なんか言い方おかしいので訂正
クエリキャッシュはインデックスあってもなくてもやってくれる
インデックス貼って、クエリキャッシュもあれば…という意味です
0789nobodyさん2013/09/16(月) 22:02:17.55ID:???
Railsのスレッドモデルについて教えてください!
プログラミング自体独学なのでもしかしたらとんでもなく馬鹿なことを言ってるかもしれないですが指摘頂けたら嬉しいです。

たとえばUnicornを使った場合、
まずUnicornのワーカースレッドごとにRailsフレームワーク一式がメモリにロードされる。
Railsはマルチスレッドで動作するので、Unicornの各ワーカースレッドの中でRailsのスレッドが複数生成される。
一つのリクエストに対してはこのRailsのスレッドが対応する。
Railsのスレッドはリクエストが来るたびに対応するcontrollerクラスのインスタンスを生成し、処理してviewをレンダーして返す。

合ってますでしょうか?Railsのスレッドってあたりがかなり曖昧でよく分かりません。
0790nobodyさん2013/09/16(月) 23:34:10.50ID:???
>>782
ありがとうございます。
通りました


>>786
ありがとうございます。

class Maker < ActiveRecord::Base
has_many :series

attr_accessible :name
validates :name, :uniqueness => true, :presence => true
end

class Series < ActiveRecord::Base
belongs_to :maker

attr_accessible :name, :maker_id
validates :name, :uniqueness => true, :presence => true
validates :maker_id, :presence => true
end

としました
0791nobodyさん2013/09/17(火) 21:43:16.02ID:???
PHPをやりたいんですが、と相談したところ
一からPHPやるんやったら、Rubyをやり
と言われました
理由は?
0792nobodyさん2013/09/17(火) 21:51:05.08ID:???
PHPで変な癖つけてしまったらつぶしが効かなくなる
0793nobodyさん2013/09/17(火) 22:26:04.57ID:???
逆だろ
Railsから入ったプログラマとかマジで何も分かってない奴多すぎる
最近じゃRails案件しかできません、ってのもザラ
0794nobodyさん2013/09/17(火) 22:58:23.56ID:???
PHPしかできません、のレベルの低さを知らんと見える
0795nobodyさん2013/09/17(火) 23:07:24.25ID:???
最初の言語なんて何でも良いと思うけどね
0796nobodyさん2013/09/17(火) 23:16:48.65ID:???
>>789
railsはシングルスレッド
0797nobodyさん2013/09/17(火) 23:17:57.32ID:???
>>789

深く考えたことなかった
俺も知りたい
0798nobodyさん2013/09/18(水) 13:21:27.97ID:38KesYgn
グーグルがMySQLを切り捨ててMariaDBを採用 | ReadWrite Japan
http://readwrite.jp/archives/1018
0799nobodyさん2013/09/18(水) 14:17:04.51ID:38KesYgn
Red Hat Enterprise Linux 7でもMySQLに代えてMariaDBを採用 | スラッシュドット・ジャパン Linux
http://linux.slashdot.jp/story/13/06/16/0617201/Red-Hat-Enterprise-Linux-7でもMySQLに代えてMariaDBを採用

Fedora 19からはMySQLに代わりMariaDBを標準に採用「オラクルはMySQLプロジェクトをさらに閉鎖的にしている」。MariaDB Foundationもすでに設立
http://www.publickey1.jp/blog/13/fedora_19mysqlmariadbmysqlmariadb_foundation.html
0800nobodyさん2013/09/20(金) 23:47:57.34ID:/88Hvi/K
こんな風に並んでるテーブルをPOSTしたときのparamsを

<tr>
 <td>
  <input type="text" name="post[hoge]">
  <input type="text" name="post[fuga]">
  <input type="text" name="post[piyo]">
 </td>
</tr>
<tr>
 <td>
  <input type="text" name="post[hoge]">
  <input type="text" name="post[fuga]">
  <input type="text" name="post[piyo]">
 </td>
</tr>


post => [
      {:hoge=>"a", :fuga => "b", :piyo=>"c" },
      {:hoge=>"a", :fuga => "b", :piyo=>"c" },
      {:hoge=>"a", :fuga => "b", :piyo=>"c" },
      {:hoge=>"a", :fuga => "b", :piyo=>"c" }
]


こんな風に受け取りたいです。
テーブルを作るときにインデックスをその都度nameの中にいれて、name=post[1][hoge]とかいう風に作るしかないのでしょうか?
0801nobodyさん2013/09/21(土) 03:23:23.48ID:XEjHK3PQ
name="post[][hoge]" じゃなかったっけ?
0802nobodyさん2013/09/21(土) 14:52:12.97ID:mYeYwJTf
>>801
ありがとうございます。
ググってそれを見つけて試してみたんですが、なぜうまくいかないと勘違いしてしまったんでしょう。
できました。
0803nobodyさん2013/09/23(月) 00:05:34.74ID:???
fixturesでロードしたテストデータってテストを実行した後も残り続けるんですね。

全てのテスト実行後にfixturesでロードしたデータを削除するようなオプションってありますか?
0804nobodyさん2013/09/23(月) 00:06:59.80ID:???
803ですが、テストはRSpecを使っています。
0805nobodyさん2013/09/23(月) 05:12:57.84ID:???
俺はDatabaseCleanerにFactory_Girlを組み合わせて使ってる
fixtureでもたぶんいけるんじゃないかな
0806nobodyさん2013/09/23(月) 14:25:34.70ID:4mTz4dkO
Railsの4.0ってやめた方がいいのか?
0807nobodyさん2013/09/23(月) 15:03:31.07ID:???
セレクトボックスのOptionに
<option value="1">あ</option>
<option value="2">い</option>
<option value="3">う</option>

という感じにセットしたくて、
options_for_select([["あ", "1"], ["い", "2"], ["う", "3"]])
options_for_select({"1" => "あ", "2" => "い", "3" => "う" })

としたいんですが、

DBには
|id.| name |
| 1|   あ|
| 2|   い|
| 3|    う|

というデータが入っています。
idには抜けがあるかもしれません

ActiveRecordからoptions_for_selectの適切な書式に変換する簡単な方法はないのでしょうか
0808nobodyさん2013/09/23(月) 15:53:02.34ID:???
options_from_collection_for_select
0809nobodyさん2013/09/23(月) 15:54:03.03ID:MNsDJ8HM
options_from_collection_for_select(ar_collection, :id, :name)
0810nobodyさん2013/09/23(月) 15:56:35.70ID:MNsDJ8HM
なんで50分も経ってるのにかぶるんだよっ
0811nobodyさん2013/09/23(月) 16:36:05.82ID:???
>>808
>>809
どうもありがとうございます。

<%= select_tag :Test_id, options_from_collection_for_select(Test.all, :id, :name), {:include_blank => true }%>

で出来ました
0812nobodyさん2013/09/23(月) 21:12:55.51ID:???
>>806
マイナーでバージョンアップに対応してないgemに依存してるなどの状況がない限り、やめる理由がないかと
0813nobodyさん2013/09/24(火) 00:10:56.84ID:???
>>805
レスありがとうございます!DatabaseCleaner試してみます。
0814nobodyさん2013/09/24(火) 19:29:33.26ID:8nD8zdFn
通常のブラウザでアクセスすると正常にリダイレクトできているのに、機能テストにてリダイレクト先がnilだと言われエラーになり困っています。
1) Error:
test_should_destroy_b(BControllerTest):
ActionController::ActionControllerError: Cannot redirect to nil!
「A(1)」と「B(多)」二つのモデルがあります。内容はBのdestroyアクションを実行した時に、Bのindexではなく、Aのshowを呼びたいというものです。
(必要な部分を抜粋したのが下記です)

A.rb: has_many :B
B.rb: belongs_to :A
bs_controller.rb:
def destroy
@b = B.find(params[:id]); @a = @b.a; @b.destroy
respond_to do |format|
format.html { redirect_to @a } #ブラウザでは正常にAのshowアクションが呼び出されるが、機能テストではなぜか@aがnilになっている
format.json { head :no_content }
end
end
bs_controller_test.rb:
setup do
@b = bs(:one)
end
test "should destroy b" do
@a = @b.a; assert_difference('B.count', -1) do
delete :destroy, id: @b
end
assert_redirected_to @a #(あるいはassigns(:a)なのでしょうが、そもそもこの検証に辿り着く前にコントローラー側でエラーが出ます。)
end
end
bs.yml: one: a_id: 1
as.yml: one:{} #no column
0815nobodyさん2013/09/24(火) 22:34:01.92ID:???
似たような症状を経験したことがあるけどその時はテストのフィクスチャが正常にDBに保存されてないだけだった
08168142013/09/25(水) 01:21:39.88ID:qN1AVHHO
色々試して見たところ、機能テストでも直接のカラム(@b.a_id)は参照できているようなので、
下記のコードに書き直したところ、テストは通りました。
@b.a_idは取得できても、@b.aが参照できていないようです。
has_manyとか、belongs_toが効いてないんでしょうかね・・・


bs_controller.rb:
def destroy
@b = B.find(params[:id])
@a_id = @b.a_id # 機能テストでは@a_idには正常に1が入る
@a = @b.a # 機能テストでは@aがnilになる
@b.destroy
respond_to do |format|
# format.html { redirect_to @a } #ブラウザでは正常にAのshowアクションが呼び出されるが、機能テストではなぜか@aがnilになっている
format.html {redirect_to cart_path(@cart_id)}
format.json { head :no_content }
end
end

bs_controller_test.rb:
・・・
assert_redirected_to cart_path(assigns(:cart_id))
・・・
08178142013/09/25(水) 01:22:10.64ID:???
>>815
気になってテスト用DBを見に行きました。
フィクスチャで生成した行のidは1から順に振られていくものだと思っていたのですが、
ランダムな値がidに指定されているのですね!

sqlite3 db/test.sqlite3
sqlite> select * from A
...> ;
298486374|2013-09-24 15:57:25|2013-09-24 15:57:25
sqlite> select * from B
...> ;
298486374|1|2013-09-24 15:57:26|2013-09-24 15:57:26 # |1|がa_idの部分

それでテスト中でid=1のAを探しても見つからなかったということだったみたいです。
bs.yml: に
one:
a: one
としたところ、無事@b.aが参照されました!
developmentモードでcreateされるAはidが1~順に増えていくので、
テストfixtureでも同様だと思っていました。理由が分かってすっきりしました。
ありがとうございました。
0818nobodyさん2013/09/25(水) 01:28:16.08ID:???
railsの和訳がないのはrails関係の書籍が売れるから
ぼろ儲けするならrails関係の本を書け
0819nobodyさん2013/09/25(水) 04:11:14.24ID:???
書け書け
kindleで出版してくれ
0820nobodyさん2013/09/26(木) 07:53:53.72ID:???
CakePHPなら通常の共用レンタルサーバーに作ったプログラムを放り込むだけで動いちゃうわけだけど、

Railsとなると、VPS借りて鯖構築からしなきゃならんのよね?

セキュリティー対策面とか考えても辛すぎない?
0821nobodyさん2013/09/26(木) 07:56:28.75ID:???
つheroku
0822nobodyさん2013/09/26(木) 09:50:29.63ID:SmKIi4WZ
自分でサーバ立てるのってなんか楽しそうだしスゴそうだよね?
サーバ立てるのなんてちょっとパソコンに詳しければ簡単にできるんでしょ?
ハードウェアの多重化なんて必要?
企業で使うとかじゃなく個人的に細々と立てたサーバが攻撃されることなんて滅多にないよね?
攻撃が来るって言ったって大した数じゃないんでしょ?
攻撃されたって大したことは起きないんでしょ?
http://b.hatena.ne.jp/entry/tmaeda.s45.xrea.com/20041101.html
0823nobodyさん2013/09/26(木) 09:58:07.19ID:???
攻撃されてサーバがのっとられたらたいした事が起きると思うが?
0824nobodyさん2013/09/26(木) 19:46:48.25ID:4SUn4QOR
developmentのときに、Viewなんかはリクエストのたびに毎回読み込みますけど
Controllerは毎回読み込むのでしょうか?
0825nobodyさん2013/09/26(木) 22:06:46.27ID:???
Railsサーバー構築は実際にやってみれば簡単だよ!
サーバー構築の経験が無い人にはとっつきにくく見えるかも知れないが大した事はやってない。
一度は自分でやってみた方がいい。
うちの会社でも新人の最初の課題でRailsでサービス作らせる。
awsのアカウントだけ教えて、あとはサーバー構築からアプリ作成、gitでのソース管理、デプロイ設定までを丸投げで一通りやらせる。
いい勉強になると思う。
0826nobodyさん2013/09/26(木) 22:26:51.29ID:SmKIi4WZ
HPを閲覧するだけで遠隔操作ウイルスに感染するサイバー攻撃は平成24年で1814件。
前年比約5.6倍と急増しているが、被害にあった企業は攻撃の数カ月後に気づくという無防備なケースは少なくない。
http://sankei.jp.msn.com/west/west_economy/news/130521/wec13052107010001-n2.htm
0827nobodyさん2013/09/26(木) 23:39:57.86ID:07vtBVXI
自分のPCのrubygemsと、Railsのgemは別物なのでしょうか?

というか、明らかに別物ですよね・・・

アプリ\vender\bundle\ruby\1.9.1\gems
C:\Ruby193\lib\ruby\gems\1.9.1\gems


Windowsなのですが、コマンドラインからgem installで入れるgemは自分のRubyフォルダのgemsが更新されて、
アプリのgemsは、bundle installで更新するという認識で宜しいでしょうか。
0828nobodyさん2013/09/27(金) 00:12:23.64ID:ABAcAb8Q
よくわからんのでbundleは常に--pathオプション付けて確実に独立させている。
■ このスレッドは過去ログ倉庫に格納されています