Это случалось со мной несколько раз, и мне еще предстоит найти приемлемое решение.
У меня есть форма на домашней странице сайта, которая указывает на другой контроллер, который фактически выполняет работу по обработке данных. Когда форма успешно отправлена, другой контроллер отправляет вас обратно на домашнюю страницу с хорошим flash [: уведомлением] сообщением, и это конец.
Когда возникает проблема проверки, она становится проблемой. Что я хотел бы сделать, это показать домашнюю страницу с формой с ошибками проверки. Обычно наивное решение упоминает, что вы можете визуализировать другой шаблон, но показ домашней страницы - это гораздо больше, чем визуализация шаблона, у него много функций. Единственный способ визуализировать этот шаблон - это скопировать и вставить функциональность в этом другом действии контроллера, или, возможно, забрать все функции у контроллера, что тоже не очень приятно
Есть ли лучшее решение?
Обновление : Я понимаю, что люди говорят, что действия контроллера должны быть меньше, и вызывают другой метод, но на практике я не вижу, как этого добиться. Я собираюсь опубликовать реальный пример с сайта, который я сделал.
Есть две модели и контроллеры: посты и комментарии. Пост имеет много причин. Сообщение показывается так:
def index
set_posts # sets @posts
end
def show
@post = Post.find_by_slug(params[:id])
@comment = Comment.new
if not @post
flash[:error] = "'#{params[:id]}' does't exist"
set_posts
render :action => :index, :status => :not_found
end
end
private
def set_posts
@posts = Posts.get_all_public_posts
end
Контроллер комментариев имеет только действие создания:
def create
@comment = Comment.new(params[:comment])
@comment.post = Post.find_by_slug params['post_id']
if not @comment.post
# Now what?
# We should here call PostsController.set_posts and render views/posts/index
end
if @reason.save
flash[:notice] = 'Thank you for your message.'
redirect_to(@reason.item)
else
# Now what?
# We should here call PostsController.show without overriding the @comment
end
end
конец
"Что теперь?" части, для которых у меня нет хорошего решения.