2

私は最初の比較的単純な Ruby on Rails (3.2) アプリケーションを作成しています。アイデアは、電子メールアカウントを管理することです。スキーマはかなり単純です。

t.string   "email"
t.string   "password"

ActiveRecord モデルは次のように定義されます。

class Mailuser < ActiveRecord::Base
  attr_accessible :email, :password

私はすべてのform_for(@mailuser)@mailuser.update_attributes(params[:mailuser])魔法で足場を使用してきました。それはうまくいきます。

ここでの奇妙な点は、ドメイン(例: "example.org") はそのままにしておく必要がある一方で、ユーザーは電子メールのユーザー部分 (例: "foo")のみを編集できるようにする必要があるということです。ただし、電子メールフィールドには完全な電子メール アドレスが含まれます (例: "foo@example.org")。したがって、編集フォームではフィールドを表示しません

  • Eメール
  • パスワード

むしろ

  • ユーザーパート
  • パスワード

は(編集可能) +ドメインuserpart(編集不可)として表示されます。@mailuser.userpart

したがって、次のようにユーザー部分にゲッターとセッターを追加することで解決すると思いました。

class Mailuser < ActiveRecord::Base
   attr_accessible :email, :password

   # Getter for the user part (left of '@')
   def userpart
      email.split('@')[0]
   end

   # Setter for the user part (left of '@')
   def userpart=(new_userpart)
      email = email.sub(/(.+)@/, new_userpart+"@")
   end

実際、@mailuser.userpart作品はうまくいきます。そして、それは にも適切に表示されますform_for(@mailuser)@mailuser.update_attributes(params[:mailuser])しかし、コントローラーのupdateメソッドを使用してフォームを保存するときに問題が発生します。Rails は@mailuser、 を通じて利用可能になった属性からオブジェクトを更新しようとするようですattr_accessible。ただし、userpart属性は実際のデータベース フィールドを反映しません。

では、そのようなメソッドを ActiveRecord モデルに追加して機能を追加する適切な方法は何だろうか? 私は Pylons (Python MVC フレームワーク) に慣れており、そのような追加のメソッドをずっと使用することができました。

(実際、データベース スキーマを変更することによってユーザーとドメインの部分を分割することはできません。データベースは他のアプリケーションによって使用されているため、その外観に固執しています。)

前もって感謝します。

4

2 に答える 2

0

ソリューションの鍵は仮想属性です。私の例では、実際の解決策は次のとおりです。

  • インスタンス変数の値を変更するself.email代わりに割り当てます。ローカル変数を作成したばかりですemail。(この場合のように混乱を招く可能性があるのは、Ruby の便利な機能であるemailことを私は知りませんでした。)self
  • attr_accessible :userpartモデルでの使用

これは、(無料ではない) http://railscasts.com/episodes/16-virtual-attributes-revised?autoplay=trueスクリーンキャストで詳しく説明されています。仮想属性は Rails の公式ドキュメントのどこで説明されているのだろうか。

于 2013-04-09T11:42:59.537 に答える