#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я пытаюсь пройти руководство по началу работы с Ruby on Rails (guides.rubyonrails.org ) и я сталкиваюсь с этой проблемой, которую, похоже, не могу понять. Я дошел до того момента в руководстве, когда я могу создать статью, но перенаправление для просмотра статьи сразу после создания не работает, и я получаю сообщение об ошибке с надписью:
NoMethodError in Blog::ArticlesController#create
undefined method `article_url' for #<Blog::ArticlesController:0x00007f814841af20>
Вот мой код контроллера статьи:
class Blog::ArticlesController < ApplicationController
def new
@article = Article.new
end
def create
@article = Article.new(params.require(:article).permit(:title, :category, :text))
@article.save
redirect_to @article # <-- This line throws error
end
def show
@article = Article.find(params[:id])
end
end
и вот мои маршруты.rb (опущен нерелевантный код):
Rails.application.routes.draw do
# <-- other get functions here
get 'blog', to: 'blog#index'
namespace :blog do
resources :articles # <-- Suggestions were to make these plural
end
root 'about#index'
end
Единственное отклонение, которое я сделал от руководства, заключается в том, что я хотел разместить статьи в пространстве имен, а также ввести 1 дополнительное значение в форме (категория). Единственными предложениями по исправлению моей проблемы, когда я искал, было сделать resource
во множественном числе, но в моем коде это уже есть, и добавить @article = Article.new
в def new
контроллер, но это добавление не имело никакого значения.
Я нашел обходной путь, который будет правильно перенаправлять после создания новой статьи, то есть строки следующим образом:
redirect_to :action => "show", :id => @article.id
Но это не похоже на «Rails Way» (соглашение о конфигурации), и я действительно не понимаю, почему предлагаемый код в руководстве не работает для меня
Комментарии:
1. Потому что маршрут, который создается этими двумя вещами, отличается. Поэтому, когда вы помещаете его в пространство имен, маршрут меняется. Поэтому вам нужно изменить перенаправление. Перенаправление на @article, вероятно, было чем-то вроде
/article/:id
и вам нужно/blog/article/:id
, верно? Итак, вам нужно изменить маршрут для перенаправления на него, потому что маршрут для/article/:id
не существует. Это объяснение ошибки действительно рассказывает вам все о проблеме, и вы выяснили один способ ее решения. Итак, в чем именно заключается вопрос?2. @RockwellRice Вопрос, который я хотел задать, заключался в том, почему
redirect_to @article
у меня не работает, и вы прекрасно объяснили это. Я не ожидал, что пространство имен будет иметь значение, поскольку я предполагал, что @article правильно перенаправит его. Однако у меня есть еще один вопрос: является ли решение / обходной путь, который я придумал, лучшим способом (или хорошим способом), или есть какой-то другой способ «rails», который лучше?3. Приведенный ниже ответ, вероятно, больше соответствует тому, как выглядит контроллер, и это то, что я делаю с подобными вещами. Эти помощники маршрута просто создаются. Поэтому, когда он находится в пространстве имен blog, он становится
blog_article_path(@article)
вместоarticle_path(@article)
. Один совет, всякий раз, когда у вас возникает проблема с маршрутизацией, запуститеrake routes
и вы сможете увидеть, с чем вы работаете, и, вероятно, решить любую проблему. Вы бы увидели именованный маршрут, как в ответе ниже4. @RockwellRice ах, теперь все предельно ясно. Большое вам спасибо и спасибо за советы
Ответ №1:
Способ перенаправления на правильный маршрут в Rails-ey — сначала проверить терминал с помощью rails routes
. Там вы увидите, хотите ли вы перенаправить в articles#show
пространство имен blog
, которому соответствует префикс (первый столбец) blog_article
. Вы можете использовать этот префикс с _path
методом следующим образом:
redirect_to blog_article_path(@article)