«Не удалось найти <model>без идентификатора» проблемы маршрутов / сеансов - PullRequest
1 голос
/ 25 ноября 2011

Я искал свою проблему высоко и низко здесь и не совсем нашел правильный ответ.Я думаю, что это может быть простой вопрос маршрутов.В моем приложении пользователь может создать проект и следить за «растениями» в своем проекте, прежде чем он будет официально зарегистрирован.Маршруты обновления и редактирования самого проекта работают нормально.Я получаю сообщение об ошибке «Не удалось найти проект без идентификатора» только после того, как я пытаюсь получить доступ к действию CREATE в моем контроллере «Prelationships», чтобы построить связь между «Project» и «Plants».Мой код ниже:

Мои маршруты.рб

resources :sessions,       :only => [:new, :create, :destroy]
resources :microposts,     :only => [:create, :destroy]
resources :relationships,  :only => [:create, :destroy]  
resources :prelationships, :only => [:create]
resources :plants   
resources :projects do        
  member do
   get :pfollowing, :pfollowers  
  end
end       

Мой контроллер "Отношения"

class PrelationshipsController < ApplicationController

  def create   
    @project = Project.find(params[:project_id])                                   
    @plant = Plant.find(params[:prelationship][:pfollowed_id])
    @project.pfollow!(@plant)
    respond_to do |format|
      format.html { redirect_to @project }
      format.js { redirect_to @project }
    end
  end
end

Моя модель "Отношения"

class Prelationship < ActiveRecord::Base                          
attr_accessible :pfollowed_id

belongs_to :pfollower, :class_name => "Project"
belongs_to :pfollowed, :class_name => "Plant"

validates :pfollower_id, :presence => true
validates :pfollowed_id, :presence => true
end                

Моя модель "Projects"

class Project < ActiveRecord::Base                    
attr_accessible :title, :address, :latitude, :longitude, :state      

belongs_to :user        
has_many :prelationships, :foreign_key => "pfollower_id",
                        :dependent => :destroy   
has_many :pfollowing, :through => :prelationships, :source => :pfollowed          

  def pfollowing?(pfollowed)
    prelationships.find_by_pfollowed_id(pfollowed)  
  end  

  def pfollow!(pfollowed)
    prelationships.create!(:pfollowed_id => pfollowed.id)
  end
end    

Моя модель "Plants"

class Plant < ActiveRecord::Base      

has_many :prelationships, :foreign_key => "pfollowed_id",
                        :class_name => "Prelationship"
has_many :pfollowers, :through => :reverse_prelationships, 
                    :source => :pfollower   
end

Моя часть для построения отношений на странице @project 'show'

<%= form_for @project.prelationships.build(:pfollowed_id =>
                                 @project_id) do |f| %>
<%= collection_select(:prelationship, :pfollower_id, Plant.all, :id, :name, options =   
{:prompt => "Select your plants"}, :class => "listselect") %>
<div class="actions">
<%= f.submit "Pfollow" %>
 </div>
<% end %>

Сообщение об ошибке «Не удалось найти проект без идентификатора» после нажатия кнопки «Отправить» на парциальном.

app/controllers/prelationships_controller.rb:4:in `create'

и Параметры:

{"utf8"=>"✓",
"authenticity_token"=>"NKqa1f0M2yPLQDHbRLnxl3SiwBeTus/1q1hpZjD7hgY=",
"prelationship"=>{"pfollower_id"=>"5"},"commit"=>"Pfollow"}  

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

Помогите этому новичку, пожалуйста!

1 Ответ

2 голосов
/ 25 ноября 2011

Простой способ:

<%= form_for @project.prelationships.build(:pfollowed_id =>
                             @project_id) do |f| %>
    <%= collection_select(:prelationship, :pfollower_id, Plant.all, :id, :name, options =   
    {:prompt => "Select your plants"}, :class => "listselect") %>
    <%= hidden_field_tag :project_id, @project.id %>
    <div class="actions">
        <%= f.submit "Pfollow" %>
    </div>
<% end %>

И правильный способ - создать вложенный маршрут для проектов, но вы можете выполнить этот рефакторинг как упражнение на потом.

...