2013-08-22 3 views
0

У меня есть странное NoMethodError, которое появляется, когда форма не проходит проверку в Rails. Я могу получить доступ к «новому» методу без проблем, чтобы заполнить форму в первый раз. Но тогда форма подчиняется вложенному контроллеру, и если проверка не выполняется, она пыталась снова перенаправить на «новый» (как следует), но бросает undefined method articles_path.Нечетный NoMethodError при завершении проверки

Я думал, что это может быть связано с гнездом, но я считаю, что настройка здесь правильная для загрузки вложенного «нового» пути?

Уверен, что мне не хватает чего-то очевидного ... Но почему это происходит?

Контроллер:

def new 
    @user = User.find(current_user) 
    @article = Article.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @article } 
    end 
    end 

    def create 
    @article = current_user.articles.build(params[:article]) 

    respond_to do |format| 
     if @article.save 
     format.html { redirect_to root_path, :flash => { :notice => 
      "Article added!" } } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @article.errors, :status => 
      :unprocessable_entity } 
     end 
    end 
    end 

Форма:

= form_for([@user, @article], :html => { :multipart => true }) do |f| 
    - if @article.errors.any? 
    #errorExplanation 
     %h2 
     = pluralize(@article.errors.count, "error") 
     prohibited this post from being saved: 
     %ul 
     - @article.errors.full_messages.each do |msg| 
      %li= msg 

    .clearfix 
    = f.label :title, "Article title *" 
    .input 
     = f.text_field :title 
+1

Попробуйте настроить @user в вашем методе создания, так как вам нужна его новая форма. –

ответ

3

Вы правы, что ошибка вызвана вложенной ресурса, в частности, эта часть кода

= form_for([@user, @article], :html => ... 

При проверке не удалось, @user - это nil, что приводит к тому, что URL-адрес выглядит как [nil, @article] whi ch переходит в article_path, если @article не сохраняется. Таким образом, решение должно установить @user в действие create.

+0

Это сработало, спасибо огромное! – Nick

+0

@ Ник, просто не о настройке '@ user'. Вместо '@user = User.find (current_user)' вы можете просто сделать '@user = current_user'. – Mischa

+0

Ох - хорошо знать, спасибо. Это просто для чтения кода или есть ли связанное с этим улучшение запросов к базе данных? – Nick

Смежные вопросы