Rails маршрутизация для обновления модели без передачи: id - PullRequest
2 голосов
/ 21 марта 2012

У меня довольно простая модель «Пользователь», управление и представления для приложения Rails.Я пытаюсь добавить раздел «профиль», в котором пользователь может обновить свою информацию о пользователе после входа в систему (и сохранения своего user_id в качестве переменной сеанса).

Я создал базовую модель «профиля», контроллер ипредставления (_form, индексировать и редактировать все с помощью simple_form).Модель пуста, и представления являются в значительной степени копией пользовательских представлений, за исключением того, что я переместил формат 'show' в представление индекса профиля.В моем контроллере я в значительной степени скопировал пользовательский контроллер, удалил действия new, create, show и destroy.

Вот что у меня есть:

class ProfileController < ApplicationController
  def index
    @profile = User.find(session[:user_id])
  end

  def edit
    @profile = User.find(session[:user_id])
  end

  def update
    @profile = User.find(session[:user_id])

    respond_to do |format|
      if @profile.update_attributes(params[:profile])
        redirect_to @profile, notice: 'Profile was successfully updated.'
      else
        render action: "edit"
      end
    end
  end

 end

Я пробовал оба этих формата маршрутов:

  match "profile" => "profile#index"  
  match "profile/edit" => "profile#edit"
  match "profile/update" => "profile#update"

и

  controller :profile do
    put 'profile/update' => :update
    get 'profile' => :index
    get 'profile/edit' => :edit
  end

Когда я загружаю ~ / profile / edit /, форма отображается правильно и мои поля заполняются.Я использую simple_form, и вот начало моего файла _form.html.erb:

<%= simple_form_for @profile, :url => url_for(:action => 'update', :controller => 'profile'), :html => { :id => "edit_profile", :class => 'form-horizontal' }, :method => 'put' do |f| %>

, но simple_form по-прежнему передает for="user_***" на все поля ввода.

Я обновил @profile.update_attributes(params[:profile]) до @profile.update_attributes(params[:user]), думая, что это проблема.Когда я нажимаю «Обновить пользователя» (все еще ссылается на модель пользователя).Форма перезагружается в ~ / profile / update, но ничего не происходит.

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

1 Ответ

2 голосов
/ 21 марта 2012

Я предполагаю, что это не проблема маршрутизации / модели. Ваша страница редактирования профиля все еще ссылается на пользователя, потому что ваш @profile является User, а не Profile.

Во-первых, если вы хотите следовать соглашению Rails, которое я настоятельно рекомендую, используйте форму множественного числа для класса контроллера как class ProfilesController < ApplicationController.

Затем определите маршруты для ресурса вашего профиля как resources :profiles, :only => [:index, :edit, :update]

Ваши профили # редактировать как:

def edit
  @profile = User.find(session[:user_id]).profile #(i.e. if user has_one profile)
  # or @profile = Profile.find(params[:id) depending on what params are being passed here
end
...