propertyってどう使うのか?
setter/getterを自動的に生成してくれるという簡単な覚え方をしてます。
例えば以下のようなコードを
- (int)hoge; - (void)setHoge:(int)hoge;
こんな感じでコードの省略ができる
@property (readwrite) int hoge;
※注意点
objective-cではgetterには'get'を頭につけない。setterには'set'をつける。(propertyを使うと意識する必要なくなるが・・・)
@interface MyClass : NSObject { NSString *value; } @property(copy, readwrite) NSString *value; @end @implementation MyClass @synthesize value; @end
@synthesizeを宣言すると属性に応じたアクセサが自動的に生成される。調査が足らんので詳しくは後日。。。
以下備忘録
属性 | 説明 |
---|---|
retain | 代入時にオブジェクトに対してretainを呼び出す必要があることを指定します。この属性はObjective-Cオブジェクトに対してのみ有効です (Core Foundationオブジェクトに対してはretainは指定できません。詳しくはCore Foundationを参照してください)。 |
readwrite | プロパティを読み取り/書き込み可能として扱うべきであることを示します。これはデフォルトで適用されます。@implementationではgetterとsetterの両方のメソッドが必須であり、@synthesizeを使う場合はgetterメソッドとsetterメソッドが合成されます。 |
readonly | プロパティが読み取り専用であることを示します。デフォルトは、読み取り/書き込みが可能です。ドット構文を使って値を代入しようとすると、コンパイラエラーが発生します。@implementationではgetterメソッドだけが必須であり、@synthesizeを使う場合は、getterメソッドだけが合成されます。 |
assign | setterで単純代入を使用することを指定します。これはデフォルトで適用されます。このキーワードを使う場合、アプリケーションはガーベジコレクション(GC)を使っていないと、単純代入は適切な振る舞いではなくなるためコンパイラ警告が発生します。GCでないアプリケーションの場合は、オブジェクトへの警告を避けるために、格納方法の属性の1つを明示的に指定する必要があります。GCを使わないアプリケーションで変数がNSCopyingプロトコルを採用していると、その状況でのassignの使用は通常は適切でないため、この属性に対して警告が発生します。 |
copy | 代入にオブジェクトのコピーを使用することを指定します。コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に対してのみ有効であり、その場合はNSCopyingプロトコルを実装する必要があります。 |
nonatomic | 合成されるアクセサが非アトミックになるように指定します。 |
テーブルの中のtrの表示・非表示を切り替える
めっさ迷いました。
昔は、visibilityでhiddenとかvisibleで表示/非表示を切り替えて内部の要素のサイズを0にしてなど
面倒なことやってたけど、display='none'で消えるじゃないか!ということに気付き、試してると
消えるけど、display='inline'やdisplay='block'などで対応してたらなぜかテーブルが崩れてしまう。
ということで下記対応とした。blockはIEのみ対応のようなので、下記対応でよいらしい。。。
document.ElementById("hoge").style.display='none' //非表示 document.ElementById("hoge").style.display='' //表示
いじょ
map.resourceのネスト
undefined method `admin_groups_path' for#
上のようなエラーがでました。
そもそもscaffoldを使ってadmin/groupを作ろうとしてたんですが・・・
ずっと上のエラーが出て困りました。
ruby script/generate scaffold admin/group name:string
結局エラーをどのように対応したかというと
routes.rbに
map.namespace :admin do |admin| admin.resources :groups end
を追加しました。
これでエラーでなくなりました。
selectタグで悩んじゃいました
ActionView::Helpers::FormBuilderじゃないかと思うんですがselectの
書き方が分からなかったんで、ひたすら調べてたらかいてくれてる人がいて助かりました。
nyaagoさんのページです。
- controller
@places = Place.find(:all)
- view
<%= f.select :place, @places.collect{|p| [p.name, p.id ]} %>
p.nameがselectで表示される文字列で、p.idがvalueに入ります。
modelをrails2.1.0で作ってみる
rails2.1.0で以下のコマンドを実行します
ruby script/generate model event
以下のファイルが作成される
class CreateEvents < ActiveRecord::Migration def self.up create_table :events do |t| t.timestamps end end def self.down drop_table :events end end
このt.timestampsがupdated_atやdeleted_atと同等の意味をなしているなんて・・・
以下はrails1.2.6を使ったときにcreate_tableに書き込んだ内容
t.column :title, :string t.column :contents, :text t.column :start_date, :datetime t.column :end_date, :datetime t.column :created_at, :datetime t.column :updated_at, :datetime t.column :deleted_at, :datetime
これをrails2.1.0で表すと
class CreateEvents < ActiveRecord::Migration def self.up create_table :events do |t| t.string :title, :null => false t.text :contents t.datetime :start_date, :end_date, :null => false t.datetime :deleted_at t.timestamps end end def self.down drop_table :events end end
凄いですよね。t.columnと記載する必要がなくなり、いきなり型を指定できて、同じオプションの場合、複数同時に宣言できる。。。とっても変わりましたね(汗)
同時に宣言しているのは以下の文です。
t.datetime :start_date, :end_date, :null => false
これでdb:migrateすると〜
mysql> desc events; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | contents | text | YES | | NULL | | | start_date | datetime | NO | | NULL | | | end_date | datetime | NO | | NULL | | | deleted_at | datetime | YES | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+
こんにゃ感じです。
rubyインストールから〜
基本的にportではバージョンが古い(安定版)のでインストールしません。ソースからコンパイルしていきます。
1.rubyインストール
http://www.ruby-lang.org/ja/downloads/からruby-1.9.0-2.tar.gzを取得
sudo tar xvzf ruby-1.9.0-2.tar.gz cd ruby-1.9.0-2 sudo ./configure sudo make sudo make install
2.mysqlインストール
http://www-jp.mysql.com/からmysql-6.0.4-alpha.tar.gzをダウンロード
sudo tar xvzf mysql-6.0.4-alpha.tar.gz cd mysql-6.0.4-alpha sudo ./configure sudo make sudo make install
3.rubygemインストール
sudo wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz sudo tar xvf rubygems-1.2.0.tgz cd rubygems-1.2.0 sudo ./configure sudo make sudo make install
4.railsインストール
sudo gem install rails
5.mysqlアダプタインストール
通常のgemインストールだと、エラーが発生したので色々しらべて以下を実施で解決。
sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
6.mongrelインストール
sudo gem install mongrel
7.mongrel_clusterインストール
sudo gem install mongrel_cluster
※ちなみにgemはバージョン指定してインストールできます
sudo gem install rails --version 1.2.6
mongrel_clusterのbaseをコピーする
sudo cp /Library/Ruby/Gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/
一部書き換えました
<span style="color:#FF0000;">CONF_DIR=/etc/mongrel</span> <span style="color:#FF0000;">PID_DIR=/usr/local/hoge/tmp/pids/</span> <span style="color:#FF0000;">USER=root</span> <span style="color:#FF0000;">GROUP=wheel #これ追加</span> RETVAL=0 # Gracefully exit if the controller is missing. which mongrel_cluster_ctl >/dev/null || exit 0 # Go no further if config directory is missing. [ -d "$CONF_DIR" ] || exit 0 case "$1" in start) # Create pid directory mkdir -p $PID_DIR <span style="color:#FF0000;"># chown $USER:$USER $PID_DIR</span> <span style="color:#FF0000;"> chown $USER:$GROUP $PID_DIR</span> mongrel_cluster_ctl start -c $CONF_DIR RETVAL=$? ;; stop) mongrel_cluster_ctl stop -c $CONF_DIR RETVAL=$? ;; restart) mongrel_cluster_ctl restart -c $CONF_DIR RETVAL=$? ;; status) mongrel_cluster_ctl status -c $CONF_DIR RETVAL=$? ;; *) echo "Usage: mongrel_cluster {start|stop|restart|status}" exit 1 ;; esac exit $RETVAL
mongrel_cluster.yml作成
sudo vi /etc/mongrel/mongrel_cluster.yml
user: root # 作成したユーザ group: wheel # 作成したグループ port : 8000 # このポートからはじめる cwd: /usr/local/hoge # アプリケーションを置いている場所 log_file: log/mongrel.log # ログファイル名 environment: production # development or production or test pid_file: tmp/pids/mongrel.pid # pidのありか servers: 2 # プロセス起動数
これで起動するはず
sudo chmod 755 /etc/mongrel_cluster sudo /etc/mongrel_cluster start
起動確認
ps -ef |grep ruby
以下のように表示されればOK
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /usr/bin/mongrel_rails \ start -d -e production -c /usr/local/hoge --user root --group wheel -p 8000 \ -P tmp/pids/mongrel.8000.pid -l log/mongrel.8000.log