Унаследованные ресурсы + пользователь Devise, #new недостающие обязательные ключи: [:id]

У меня проблемы с использованием Inherited Resource Gem на рельсах 4:

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

 Failure/Error: visit new_project_path
 ActionView::Template::Error:
   No route matches {:id=>#<Project id: nil, user_id: 32568, name: "", created_at: nil, updated_at: nil>} missing required keys: [:id]

Насколько я понимаю, новому действию не нужен идентификатор, единственное, что ему нужно, это доступ к пользователю, который я предоставляю через метод begin_of_association_chain.

Кто-нибудь знает, почему это происходит? Я уверен, что упускаю что-то простое?

Контроллер:

класс ProjectsController ‹ InheritedResources::Base response_to :html, :json

before_filter :authenticate_user!

protected
  def begin_of_association_chain
    #provided by devise
    current_user 
  end

private
  def permitted_params
    {:project => params.fetch(:project, {}).permit(:email, :name, :destination_ids => [])}
  end
end

Тест Rspec:

require 'spec_helper'

include Warden::Test::Helpers

describe "the signed in user" do

  before :each do
    @user = FactoryGirl.create(:confirmed_user)
    login_as(@user, scope: :user)
  end

  describe "with new project" do

    before :each do
      @project = FactoryGirl.attributes_for(:project)
      visit new_project_path
      fill_in "project_name", with: @project[:name]
    end

    it "can create" do
      expect { click_button('Create Project') }.to change(Project, :count).by(1)
    end

  end

end

Вид:

<div class="row">
 <div class="large-12 columns">
  <%= form_for(@project) do |f| %>

    <% if @project.errors.any? %>
      <div data-alert class="alert-box alert"><%= pluralize(@project.errors.count, "error") %> prohibited this source from being saved:</div>
    <% end %>

    <%= f.text_field_block :name, placeholder: "Your project's name", maxlength: 500 %>

    <hr>

    <div class="row">
     <div class="large-5 columns">
        <%= f.submit class: "button tiny" %> <%= link_to 'Back', :back, class: "button secondary tiny" %>
     </div>
    </div>
  <% end %>
 </div>
</div>

Маршруты:

projects POST     /projects(.:format)           projects#create
new_project GET   /projects/new(.:format)       projects#new
edit_project GET  /projects/:id/edit(.:format)  projects#edit
project GET       /projects/:id(.:format)       projects#show
PATCH             /projects/:id(.:format)       projects#update
PUT               /projects/:id(.:format)       projects#update
DELETE            /projects/:id(.:format)       projects#destroy

person Rtype    schedule 22.01.2014    source источник


Ответы (1)


Я нашел ответ.

В моем коде я перебираю различные проекты для создания ссылок быстрого доступа.

В активном ресурсе, когда вы создаете новую модель, она использует: current_user.project.build(), это добавляет моему пользователю один несохраненный объект, у которого нет идентификатора. Когда я зациклился на создании ссылок проекта, рельсы жаловались, потому что не могут создать ссылку на несохраненный объект без идентификатора.

person Rtype    schedule 24.01.2014
comment
так как ты это обошёл? - person ahnbizcad; 01.10.2014
comment
в основном, у меня был один несохраненный объект в моем графе объектов (например, к учетной записи прикреплен пользователь, который не был сохранен). Итак, как только я обнаружил, что его туда помещало, и остановил его, это решило мою проблему. К сожалению, я не помню точных деталей, возможно, если вы опубликуете вопрос с некоторыми подробностями, я увижу, смогу ли я помочь? Также имейте в виду, что над InheritedResources больше не работают. - person Rtype; 01.10.2014