Почему я не могу отобразить форму редактирования?

Я создал приложение, в котором у пользователя есть_один профиль, а профиль принадлежит пользователю. Он настроен так, что профиль создается автоматически при создании пользователя (в пользовательском контроллере).

Я не пытаюсь настроить его так, чтобы пользователь мог посещать страницу редактирования (контроллер профиля -> действие редактирования) и редактировать информацию своего профиля через отображаемую форму (используя часть _form)

Я не могу понять, почему я не могу отобразить форму редактирования, насколько я могу судить, метод определен правильно? У кого-нибудь есть идеи, почему? Очень признателен за любую помощь!

Браузер:

NoMethodError in ProfilesController#edit
undefined method `user' for nil:NilClass    

  def edit
    @profile = @profile.user
  end

  def destroy

Контроллер профиля:

class ProfilesController < ApplicationController
  before_action :logged_in_user,  only: [:edit, :destroy]

  def edit
    @profile = @profile.user
  end

  def destroy
  end
end

Контроллер пользователей

class UsersController < ApplicationController
  before_action :logged_in_user,  only: [:edit, :update]
  before_action :correct_user,    only: [:edit, :update]

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      @user.profile = Profile.new
      @user.send_activation_email
      flash[:info] = "Please check your email to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end

...

представления/профили/edit.html.erb

<% provide(:title, 'Edit Profile') %>
<h1>Editing profile</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@profile) do |f| %>
      <%= render 'form', f: f %>
      <%= f.submit "Edit Information", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

представления/профили/_form.html.erb

<%= render 'shared/error_messages' %>

<%= f.label :first_name %>
<%= f.text_field :first_name, class: 'form-control' %>

...

person sss333    schedule 25.09.2014    source источник
comment
вы используете devise для аутентификации пользователей? если вы (и ИМХО, вы должны), вам, возможно, следует использовать @profile = current_user.profile, с вашей текущей настройкой я мог бы редактировать любой профиль пользователя, просто изменив идентификатор в URL-адресе   -  person Richlewis    schedule 25.09.2014
comment
Спасибо! что сделал это! Это такой очевидный ответ! Я кодировал весь день, так что я думаю, что мои мозги только начинают таять. Я создал свою собственную аутентификацию, чтобы лучше понять, как все работает — мне не нравилось devise, потому что я не мог видеть их контроллеры, и мне не нравилось наследование без понимания того, что происходит.   -  person sss333    schedule 25.09.2014
comment
Я могу принять ваш ответ, если вы опубликуете его как один? Вы говорите, что я должен использовать devise, потому что я не создал его достаточно, чтобы заблокировать кого-то, кто потенциально может редактировать профиль, изменив URL-адрес?   -  person sss333    schedule 25.09.2014
comment
Я не знаю, как выглядит ваша система аутентификации или какие меры у вас есть, с devise все настраивается, вы можете увидеть все контроллеры в документах, если вы хотите что-то изменить, то это довольно просто, есть много документов и по моему опыту, он создан для обеспечения безопасности и поставляется с множеством готовых методов для использования.   -  person Richlewis    schedule 25.09.2014


Ответы (2)


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

  def edit
    @profile = current_user.profile
  end
person Richlewis    schedule 25.09.2014

Вы хотите получить доступ к профилю пользователя, а не к профилю пользователей, попробуйте это в ProfilesController.

class ProfilesController < ApplicationController
  before_action :logged_in_user,  only: [:edit, :destroy]

  def edit
    @profile = current_user.profile
  end

  def destroy
  end
end
person LolWalid    schedule 25.09.2014
comment
Я попробовал это первым, и у него была та же проблема, поэтому я попытался переключить его. - person sss333; 25.09.2014
comment
Вы вошли в систему с помощью драгоценного камня разработки? если да, то у вас есть доступ к current_user - person LolWalid; 26.09.2014