сначала трудно понять, что вы должны делать вещи «рельсовым путем», потому что вся философия рельсов состоит в том, чтобы обеспечить соблюдение определенных стандартов. Если вы попытаетесь вписать привычки PHP в рельсовый костюм, он просто разорвется на части. Рельсовые направляющие - ваш лучший друг здесь ...
Чтобы быть более точным в вашей проблеме, вы должны попытаться построить что-то из ActiveModel . ActiveModel позволяет использовать все функции ActiveRecord, кроме тех, которые предназначены для реализации непостоянных объектов.
Итак, вы можете создать, скажем, модель JsonResponder:
class JsonResponder
include ActiveModel::Validations
validates_presence_of :input_1, :input_2
def initialize(attributes = {})
@attributes = attributes
end
def read_attribute_for_validation(key)
@attributes[key]
end
end
В вашем контроллере вы теперь создаете новый JsonResponder:
# this action must be properly routed,
# look at the router chapter in rails
# guides if it confuses you
def foo
@responder = JsonResponder.new(params[:json_responder])
respond_to do |format|
if @responder.valid?
# same thing as @wizard's solution
# ...
end
end
end
теперь, если ваши поля ввода пусты, к вашему объекту @responder будут прикреплены ошибки, также как и любые ошибки проверки, которые вы можете получить с объектом ActiveRecord. У этого подхода есть два преимущества:
вся ваша логика хранится внутри собственной модели. Если ваш ответ необходимо улучшить позже (например, обработать более сложный запрос) или использовать его с разных контроллеров, то будет очень просто повторно использовать ваш код. Это помогает держать ваши контроллеры худыми , и, таким образом, является обязательным, чтобы извлечь из MVC реальное преимущество.
вы должны быть в состоянии (возможно, с небольшой подстройкой) использовать рельсы-помощники форм, так что ваш вид формы должен быть только приблизительно таким:
(в эквиваленте «нового» представления)
<% form_for @responder do |f| %>
<%= f.input_field :field_1 %>
<%= f.input_field :field_2 %>
<%= f.submit %>
<% end %>
Не стесняйтесь просить о большей точности.