2009-06-12 3 views
1

これは完全にはっきりとした初心者の質問ですが、初心者向けのRubyに関するGoogleの質問に対する答えを見つけようとするのは、無駄な試みであることが分かります。とにかくモデルへのRubyカスタムクラス

、私はこのようになり、データベースのテーブルがあるとします。私はの形でのparamsをクエリ文字列を取り込んでURLを公開する必要がある場合は、今すぐ

MyMessage 
================== 
int :id 
string :from 
string :to 
string :messagetext 

を:

http://mysite.com/?sender=alice&receiver=bob&message=Hello

クエリ文字列のパラメータをモデルにマップするにはどうすればよいですか?今

、私は、コントローラ内のブルートフォースでそれをやっている:

@sender = params[:sender] 
@receiver = params[:receiver] 
@message = params[:message] 

@mymessage = MyMessage.new 
@mymessage.from = @sender 
@mymessage.to = @receiver 
@mymessage.messagetext = @message 

@mymessage.save 

私の推測では、私はクエリ文字列このタイプのリクエストを表現するクラスを作成することができるはずである、すなわち

class Request 
    attr_accessor :from 
    attr_accessor :to 
    attr_accessor :message 
end 

その後MyMessageオブジェクトにRequestオブジェクトをマップする方法を作成するために、より多くの魔法をparamsからRequestオブジェクトを作成するために、いくつかのRoRの魔法を使用して。

提案がありますか?これはまったく意味がありますか?

+0

これは「私の-最初のRailsアプリ」チュートリアルのほとんどすべて1で覆われています。あなたはそれをやりましたか? – fig

+0

はい、私はそれらのうちの4つをしました。質問を理解してもよろしいですか?私がこれを逃したチュートリアルを示すリンクを投稿することができれば、私はその質問を喜んで削除します。私はupdate_attributesを通してそれを行うことができると思うが、その理由は「初心者」と書かれている。 – jerhinesmith

+0

はい、サンプルアプリケーションを作成しました。ただし、カスタムクラスを作成して汎用モデルにマッピングすることはできません。あなたはどちらかというと怪我をするつもりはありませんが、Model/DBにはクエリーストリング経由で渡されるものとは異なるフィールド名/プロパティがあることを理解していますか? – jerhinesmith

答えて

3

あなたはこのような何かを行うことができます。

0

アクティブなレコードを使用している場合、探しているメソッドはupdate_attributesです。

それはこのようなものを見てみましょう:

def update 
    @model = Model.find(params[:id]) 
    @model.update_attributes(params[:model]) 
end 

あなたは、これは、ユーザーが変更したくない場合がありますフィールドを含む、中に渡し何かを更新するだろうことを認識する必要があり、is_adminのような例えばフラグあなたのユーザーモデル上で。私は、ユーザーが、例えば、編集できるようにしたい任意のプロパティにattr_accessible適用することをお勧め

:あなたが好きな何かができる

class Model < AR:Base 
    attr_accessible :my_safe_field_name 
end 
+0

渡されるフィールドがモデルの1対1のマッピングである場合は私には意味がありますが、この場合はモデルがジェネリックであることを暴露するため第三者が消費するさまざまなRESTful URL)。したがって、Modelには 'to'があるかもしれませんが、あるベンダーがそれを 'receiver'として渡し、別のベンダーが 'sentTo'を使うかもしれません。私は各実装のためにカスタムクラスを作成してからそれらをジェネリッククラスに 'マップ'する必要があると思いますが、どうやってそのようにするかについてはわかりません。それは理にかなっていますか? – jerhinesmith

+0

よくparams [:model]はちょうどハッシュなので、モデルに合わせてキーを変更する関数を書くことができます。しかし、なぜあなたは両方の表現を一つしか持てませんか? – jonnii

1

class MessageRequest 
    def initialize(params = {}) 
    @sender = params[:sender] 
    @receiver = params[:receiver] 
    @message = params[:message] 
    end 

    def apply_to_my_message(my_message = MyMessage.new) 
    my_message.from = @sender 
    my_message.to = @receiver 
    my_message.message_text = @message 
    return my_message 
    end 
end 

次に、あなたのコントローラのコードは次のようになります。

@mymessage = MessageRequest.new(params).apply_to_my_message 

異なる名前のパラメータに合わせてカスタマイズしたい場合はそれぞれの属性のパラメータ名を返すメソッドを保護することができた場所。例えば。

class MessageRequest 
    def initialize(params = {}) 
    @sender = params[sender_param] 
    @receiver = params[receiver_param] 
    @message = params[message_param] 
    end 

    ... 

    protected 

    def sender_param; :sender; end 
    def receiver_param; :receiver; end 
    def message_param; :message; end 
end 

そのあとのような異なるという名前のパラメータのサブクラスを作成することができます:あなたが説明してきた何のため

class OtherMessageRequest < MessageRequest 

    protected 
    def receiver_param; :sentTo; end 

end 

おそらく行き過ぎがいますが、時に取得しているうまくいけば何。もちろん

class MyMessage < ActiveRecord::Base 
    def self.new_from_web(params) 
    returning(self.new) do |message| 
     message.from  = params[:sender] 
     message.to   = params[:receiver] 
     message.messagetext = params[:message] 
     message.save 
    end 
    end 
end 

class MessageController < ApplicationController 
    def save_message 
    MyMessage.new_from_web(params) 
    end 
end 

、この全体のことは、おそらくより明確にRESTfulなセマンティクスを使用することによって、より簡単で、従来の作ることができる:

+0

Voted up。一度それをもう少し消してしまえば、それがうまくいくかどうかわかりますが、私はそれを受け入れます。ありがとう! – jerhinesmith

0

シンプルな通常の長い道のりを行く:

@message = MyMessage.new(params.slice(:sender, :receiver, :message)) 
関連する問題