ошибка simple_form_for: неопределенный метод - связанные модели - PullRequest
2 голосов
/ 26 мая 2011

В моей заявке на рельсы у меня есть две связанные модели: Журнал и Статья.

Журнал

class Magazine < ActiveRecord::Base
  has_many :articles
end

Артикул

class Article < ActiveRecord::Base
  belongs_to :magazine
end

Маршруты

Magazineapp::Application.routes.draw do
  resources :magazines do
    resources :articles
  end
end

schema.rb

create_table "articles", :force => true do |t|
  t.string   "title"
  t.string   "author"
  t.integer  "magazine_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "magazines", :force => true do |t|
  t.string   "title"
  t.datetime "created_at"
  t.datetime "updated_at"
end

Я пытаюсь создать новую статью связан с журналом с новой страницы статьи .Итак, я создал ссылку на странице показа журнала, чтобы передать выбранный журнал на страницу новой статьи.

views / magazines / show.html.erb

<p id="notice"><%= notice %></p>
<p>
  <b>Title:</b>
  <%= @magazine.title %>
</p>

<%= link_to 'Edit', edit_magazine_path(@magazine) %> |
<%= link_to 'Back', magazines_path %> |
<%= link_to 'New Article', new_magazine_article_path(@magazine) %>

Часть, отображаемая на новой странице статьи:

views / article / _form.html.erb

<%= simple_form_for([@magazine, @article]) do |f| %>
  <%= f.error_notification %>

  <div class="inputs">
    <%= f.input :title %>
    <%= f.input :author %>
  </div>

  <div class="actions">
    <%= f.button :submit %>
  </div>
<% end %>

И метод create изКонтроллер статьи:

def create

  @magazine = Magazine.find(params[:magazine_id])    
  @article = @magazine.articles.create(params[:article])

  respond_to do |format|
    if @article.save
      format.html { redirect_to(@article, :notice => 'Article was successfully created.') }
      format.xml  { render :xml => @article, :status => :created, :location => @article }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @article.errors, :status => :unprocessable_entity }
    end
  end
end

Но когда я пытаюсь создать новую статью, связанную с журналом, я получаю сообщение об ошибке:

Showing /home/wilson/magazineapp/app/views/articles/_form.html.erb where line #1 raised:

undefined method `articles_path' for #<#<Class:0x00000001944070>:0x00000001926ed0>
Extracted source (around line #1):

1: <%= simple_form_for([@magazine, @article]) do |f| %>
2:   <%= f.error_notification %>
3: 
4:   <div class="inputs">

Request

Parameters:

{"magazine_id"=>"2"}

Рейк-маршруты

    magazine_articles GET    /magazines/:magazine_id/articles(.:format)          {:action=>"index", :controller=>"articles"}
                      POST   /magazines/:magazine_id/articles(.:format)          {:action=>"create", :controller=>"articles"}
 new_magazine_article GET    /magazines/:magazine_id/articles/new(.:format)      {:action=>"new", :controller=>"articles"}
edit_magazine_article GET    /magazines/:magazine_id/articles/:id/edit(.:format) {:action=>"edit", :controller=>"articles"}
     magazine_article GET    /magazines/:magazine_id/articles/:id(.:format)      {:action=>"show", :controller=>"articles"}
                      PUT    /magazines/:magazine_id/articles/:id(.:format)      {:action=>"update", :controller=>"articles"}
                      DELETE /magazines/:magazine_id/articles/:id(.:format)      {:action=>"destroy", :controller=>"articles"}
            magazines GET    /magazines(.:format)                                {:action=>"index", :controller=>"magazines"}
                      POST   /magazines(.:format)                                {:action=>"create", :controller=>"magazines"}
         new_magazine GET    /magazines/new(.:format)                            {:action=>"new", :controller=>"magazines"}
        edit_magazine GET    /magazines/:id/edit(.:format)                       {:action=>"edit", :controller=>"magazines"}
             magazine GET    /magazines/:id(.:format)                            {:action=>"show", :controller=>"magazines"}
                      PUT    /magazines/:id(.:format)                            {:action=>"update", :controller=>"magazines"}
                      DELETE /magazines/:id(.:format)                            {:action=>"destroy", :controller=>"magazines"}

Как я могу решить эту проблему?Каковы правильные параметры для передачи в simple_form_for в этом случае?

Ответы [ 2 ]

5 голосов
/ 26 мая 2011

Если у вас есть вложенные ресурсы, вы должны убедиться, что вы всегда передаете ресурс более высокого уровня между вашими запросами.

Ваши маршруты будут теми, которые вы заметили при использовании рейковых маршрутов.

Форма должна выглядеть следующим образом:

<%= simple_form_for([@magazine, @article]) do |f| %>
  <%= f.error_notification %>

  <div class="inputs">
    <%= f.input :title %>
    <%= f.input :author %>
  </div>    
  <div class="actions">
    <%= f.button :submit %>
  </div>
<% end %>

Таким образом, теперь вы должны использовать новые маршруты повсюду на контроллере статей и страницах просмотра статей, которые будут включать сам журнал.

Ваше созданиедействие в контроллере будет:

def create

  @magazine = Magazine.find(params[:magazine_id])    
  @article = @magazine.articles.create(params[:article])

  respond_to do |format|
    if @article.save
      format.html { redirect_to([@magazine,@article], :notice => 'Article was successfully created.') }
      format.xml  { render :xml => @article, :status => :created, :location => @article }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @article.errors, :status => :unprocessable_entity }
    end
  end
end

Так что теперь все ваши маршруты должны ссылаться и на @magazine.

1 голос
/ 26 мая 2011

Запустите rake routes в консоли и убедитесь, что articles_path существует. Кажется, это должно быть названо magazines_articles_path(...)

...