我正在設計一個表單,您需要將關係添加到另一個對象。好吧,這通常很好,但是我所掛上的是一種乾淨的方式,以方便用戶輸入對象。用戶可以通過多種方式知道如何指定對象(唯一標識符)。以多種方式之一識別項目
讓我們舉個例子把用戶關聯到任務。在這種情況下,模特們制定了這樣的:
class User
has_many :tasks
# fields: phone_number, email, username
validates_uniqueness_of :phone_number
validates_uniqueness_of :email
validates_uniqueness_of :username
# other methods, validations, etc which are not important.
end
class Task
belongs_to :user
# other methods, validations, etc which are not important.
end
我怎麼會寫控制器和視圖的形式,如果我希望能夠通過用戶名,電子郵件,或PHONE_NUMBER指定用戶 - 我可能會知道這些中的任何一個,只要一個就足以明確指定我想要的用戶,在清潔的方式?
目前我的解決方案似乎很混亂。我也有類似的看法:
<% form_for @task do |f| %>
... Other stuff
User - choose one of the following ways: <br />
Username: <%= text_field_tag :user_name %> <br />
or phone number: <%= text_field_tag :user_phone %> <br />
or email: <%= text_field_tag :user_email %> <br />
... More other stuff
<% end %>
然後我處理這些領域中顯式控制器,尋找基於實際的用戶對哪些是填補了:
class TasksController
def create
@task = Task.new(params[:task])
if params[:user_name]
@task.user = User.find_by_username(params[:user_name])
elsif params[:user_phone]
@task.user = User.find_by_phone_number(params[:user_phone])
elsif params[:user_email]
@task.user = User.find_by_email(params[:user_email])
end
if @task.save
redirect_to @task
else
render :action => 'new'
end
end
end
這似乎是它是非常具體的,並且在我的控制器中有很多代碼,特別是如果我在表單上有很多這樣的代碼。當你需要動態地將多個用戶添加到任務中時,甚至不要和我談談 - 在控制器解析所有內容時,它甚至更加瘋狂。
我喜歡這樣的解決方案,因爲它完全消除了控制器,這使得更加複雜的形式時,導致最頭疼的部分代碼。如果您希望製作3個字段而不是一個字段(如果您可能在搜索中有重疊,即用戶名帶有@),則它也可用。不幸的是,當不存在JS時,它不會退化,但這不是我當前*項目的要求。 – jamuraa 2010-02-24 16:17:21
它可以稍作修改。讓搜索字段使用不同的提交值提交表單。然後,您的控制器可以重新顯示匹配用戶的表單,或者繼續基於提交值進行提交(例如:'查找用戶'與'提交') – EmFi 2010-02-24 16:33:51
也可以不使用3個字段,爲什麼不用一個字段單選按鈕或描述查找類型的選擇框(用戶名vs電子郵件vs電話) – EmFi 2010-02-24 16:50:19