2009-06-12 74 views
1

我敢肯定,這是一個完全明顯的初學者問題,但試圖找到答案在谷歌的初學者Ruby問題被證明是徒勞的練習。Ruby自定義類到模型

無論如何,假設我有一個數據庫表,看起來像這樣:

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

現在,如果我需要公開的是發生在查詢字符串PARAMS在形式的URL:

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 

然後使用一些RoR的魔法創建從paramsRequest對象,然後更神奇以創建映射Request對象到MyMessage對象的方法。

有什麼建議嗎?這是否有意義?

+0

這是包括在「我先Rails的應用程序」教程的幾乎每一個。你做過一個嗎? – fig 2009-06-12 13:59:14

+0

是的,我已經完成了其中四個。你確定你明白這個問題嗎?如果您可以發佈顯示教程的鏈接,我錯過了這一點,我會很樂意刪除這個問題。我認爲我可以通過update_attributes來完成,但問題被標記爲'newbie'。 – jerhinesmith 2009-06-12 14:08:43

+0

是的,我確實創建了示例應用程序。不過,他們似乎沒有解決創建自定義類並將它們映射到通用模型的問題。不要試圖成爲一個混蛋,但是你知道模型/數據庫具有不同的字段名稱/屬性,而不是通過查詢字符串傳遞的內容嗎? – jerhinesmith 2009-06-12 14:30:43

回答

3

你可以做這樣的事情:

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

如果你正在使用活動記錄,那麼你正在尋找的方法是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 
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 

可能是矯枉過正,但你在說什麼希望。

0

簡單,通常很長的路要走:

@message = MyMessage.new(params.slice(:sender, :receiver, :message))