`redirect_to @article` выдает ошибку `nometoderror в Blog::ArticlesController#create`

#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)