2013-06-27 3 views
0

я получаю следующее сообщение об ошибке на странице, которая содержит ссылку на кредит/изменить объект:маршрутизация ошибки Нет маршрут не соответствует ID нолю (Rails)

маршрутизация Ошибка Нет маршрут спичек {: контроллер => «connections»,: action => «edit»,: id => nil}

Мое приложение имеет страницы профиля пользователя (#show action в users_controller.rb) со ссылкой для создания или редактирования существующего «соединения», (отношения между пользователями, такими как Facebook или LinkedIn). Если соединение не существует, ссылка отправит пользователю создать новое соединение. Если соединение уже существует, ссылка отправит пользователю отредактировать существующее соединение. Моя функциональность создания отлично работает. Однако, как только соединение было создано, посещение страницы пользователя вызывает ошибку маршрутизации. Мне явно не нравится моя ссылка для действия редактирования.

Вот link_to на странице пользователя:

<% unless current_user == @user %> 
<% if @contact.present? %> 

<%= @user.first_name %> is your <%= @connection.description %> &nbsp;(<%= link_to "edit contact", { :controller => 'connections', :action => 'edit', :id => @connection.id} %>) 

<% else %> 

How do you know <%= @user.first_name %>? (<%= link_to "edit contact", { :controller => 'connections', :action => 'create', :user_id => @user.id }, :method => 'post' %>) 

<% end %> 

Ошибка также конкретно указывается, что: идентификатор установлен в ноль (NULL). Проблема должна быть здесь. Как мое приложение может ссылаться на правильное соединение? Моя переменная экземпляра должна была сделать трюк.

Вот контроллер соединения:

class ConnectionsController < ApplicationController 

def index 
end 

def update 
    @connection = current_user.connections.find(params[:id]) 
    if @connection.update_attributes(params[:connection]) 
     flash[:notice] = "Contact relationship updated" 
     render 'activities' 
    end 
    end 

    def edit 
    @connection = current_user.connections.find(params[:id]) 
    end 

    def create 
    #@user = User.find(params[:user_id]) 
    @connection = current_user.connections.build(params[:connection]) 
    @user = User.find(params[:user_id]) 
    if @connection.save 
     flash[:success] = "Contact relationship saved!" 
    else 
     render @user 
    end 
    end 
end 

А вот контроллер Пользователь показать действие (где link_to существует):

def show 
    @user = User.find(params[:id]) 
    @connection = current_user.connections.build(:otheruser_id => @user) 
    @contact = current_user.connections.where(user_id: current_user, otheruser_id: @user) 
    end 

routes.rb:

authenticated :user do 
    root :to => 'activities#index' 
    end 
    root :to => "home#index" 
    devise_for :users, :controllers => { :registrations => "registrations" } 
    resources :users do 
    member do 
     get :following, :followers, :posts, :comments, :activities, :works, :contributions, :connections 
    end 
    end 
    resources :works do 
    resources :comments 
    end 
    resources :relationships, only: [:create, :destroy] 
    resources :posts 
    resources :activities 
    resources :reposts 
    resources :comments do 
    member do 
     put :toggle_is_contribution 
    end 
    end 
    resources :explore 
    resources :connections 

Любые идеи о том, как исправить ссылку_to? Благодаря!

EDIT 1: соответствующие рейк маршруты:

connections GET /connections(.:format)       connections#index 
           POST /connections(.:format)       connections#create 
       new_connection GET /connections/new(.:format)      connections#new 
       edit_connection GET /connections/:id/edit(.:format)    connections#edit 
        connection GET /connections/:id(.:format)      connections#show 
           PUT /connections/:id(.:format)      connections#update 
           DELETE /connections/:id(.:format)      connections#destroy 
+0

Вы пробовали «рейк-маршруты» в консоли, чтобы проверить маршрут? – kasperite

+0

Привет и спасибо за ответ. Я только что разместил маршруты рейка выше. Похоже, он должен работать – winston

ответ

1

Ваша проблема заключается в:

@connection = current_user.connections.build(:otheruser_id => @user) 

, который создает объект соединения и присваивает его @connection. Этот объект не был сохранен, поэтому он не имеет идентификатора. Концептуально это тоже неправильно, как вы можете редактировать что-то, что еще не существует? Если вы хотите отправить пользователя для создания нового соединения, Connections # new - это то, что вам нужно.

+0

Привет и спасибо за ответ. Эффекты создания работают хорошо сейчас. Я могу создать соединение, используя текущее действие create (отправленное туда с помощью link_to выше). Однако, когда я пытаюсь отправить пользователя для редактирования объекта, который уже существует (я могу подтвердить, посмотрев его в базе данных), я получаю ошибку маршрутизации – winston

+1

. Добро пожаловать. Может быть, я не очень хорошо объяснил. Ваше правое представление прав, что не так, так это ваши пользователи # show view, где @connection - это экземпляр Connection, который еще не был сохранен в базе данных (вы просто создали экземпляр с 'connections.build'). Поэтому link_to helper вызывает ошибку, потому что @ connection.id is nil – boulder

+0

О, хорошо, это имеет смысл. Что я должен изменить? Я изменил его на @connection = current_user.connections.find (params [: connection]), но я получаю сообщение об ошибке при посещении страницы пользователя: Не удалось найти Connection без ID. Я не могу использовать: id, потому что это используется для отображения пользователя. – winston