Я разрабатываю форму, в которой вам нужно добавить отношение к другому объекту. Ладно, это нормально, но то, на чем я держусь, - это простой способ облегчить пользователю ввод объекта. Есть несколько способов, которыми пользователь может знать, как указать объект (уникальные идентификаторы).
Давайте рассмотрим пример привязки пользователя к задаче. В этом случае модели раскладываются так:
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
Как мне написать контроллер и просмотреть форму, если я хочу иметь возможность указать пользователя по имени пользователя, электронной почте или номеру телефона - я могу знать любой из них, и достаточно одного, чтобы точно указать пользователь, которого я хочу, clean way?
В настоящее время мое решение кажется грязным. У меня есть вид, похожий на:
<% 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
Кажется, что это очень специфично, и в моих контроллерах много кода, особенно если у меня их много в форме. Даже не говорите со мной о том, когда вам нужно динамически добавлять нескольких пользователей в задачу - это становится еще более безумным в контроллере, разбирающем все.