2015-08-28 5 views
1

Я создал модель User и модель Profile. На моей домашней странице у меня есть ссылка на панели навигации dropmenu, которая ссылается на «Редактировать профиль». Проблема, с которой я сталкиваюсь, - «Никакие соответствия маршрутов {: action =>" edit ",: controller =>" profiles ",: id => nil} отсутствуют необходимые ключи: [: id]".Как мне изменить свой профиль, связанный с пользователем?

Путь к странице редактирования «edit_profile_path» с глаголом GET и шаблоном URI «/profiles/:id/edit(.:format» ». Мне сложно вставить «id». Ниже приведен код, который у меня есть в моем приложении.

В модели Profile файле у меня есть:

class Profile < ActiveRecord::Base 
    belongs_to :user, dependent: :destroy 
end 

В файле модели пользователя у меня есть:

class User < ActiveRecord::Base 
    has_one :profile 
end 

Профиль имеет много атрибутов, но один из них является "user_id" который является целым числом, равным идентификатору пользователя. Таким образом, пользователь №5 с идентификатором № 5 является владельцем профиля № 5. Вот код, который я имею в Вид файла:

<li><%= link_to "Edit Profile", edit_profile_path(@profile) %></li> 

Что касается кода непосредственно выше, я попытался вставить различные коды в скобках, от @ profile.id, @profile, @ user.id и @user. Но это не сработало.

Я создал контроллер профилей, и я думаю (но я не уверен), что моя проблема исходит из файла profiles_controller. Вот код, у меня есть:

class ProfilesController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_profile, only: [:edit, :update] 

    def edit 
    end 

    def new 
    @profile = Profile.new 
    end 

    def create 
    @profile = Profile.new(profile_params) 
    @profile.user_id = current_user.id 
    if @profile.save 
     redirect_to welcome_path 
    else 
     render 'new' 
    end 
    end 

    def update 
    @profile.update(profile_params) 
    redirect_to welcome_path 
    end 

    private 
     def set_profile 
     @profile = Profile.find(params[:id]) 
     end 
    end 

ответ

1

Вы получаете эту ошибку, так как на ваш взгляд, ваш @profile в nil. Итак, вы должны получить current_profile, чтобы вы могли перейти на страницу редактирования этого профиля.

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

<li><%= link_to "Edit Profile", edit_profile_path(current_user.profile) %></li> 
+1

Спасибо @KMRakibul! Я ценю, что вы помогаете мне. Метод current_user работает! – Mauricio

0

Вы пробовали?

edit_profile_path(id: @profile.id) 

Также вы отправили этот маршрут в свой файл маршрутов?

+0

Спасибо @ JohnPollard! Я закончил с помощью edit_profile_path (current_user.id). Я ценю, что вы нашли время, чтобы помочь мне. – Mauricio

1

Несколько вещей, чтобы отметить (что может быть ключом к решению вашей проблемы).

  1. Вы имеете 1 к 1 отношения с, и пользователем может получить доступ к его профилю только тогда, когда он вошел в системе. Так как у вас уже есть (предположительно исправный) current_user метода, использовать его все время.

    def new current_user.build_profile end

    def create current_user.build_profile(profile_params) #etc end

  2. Это также логический способ получить профиль пользователя

    private def set_profile @profile = current_user.profile end

    на ваш взгляд:

    <%= link_to edit_profile_path(current_user.profile) %>

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

+1

Спасибо @Hristo! Я ценю, что вы нашли время, чтобы помочь мне. Я использовал ваш совет для использования current_user, и я применил его к маршруту. Мое приложение теперь позволяет пользователям редактировать свой профиль. – Mauricio