Pusty obiekt @user po wysłaniu formularza

Witam
Ostatnio mnie dopadł taki problem. Projektuję panel administracyjny dla aplikacji i chcę, żeby tylko użytkownicy ze statusem admin mieli tam wejście, więc w admin/users_controller.rb mam:

[code=ruby]before_filter :authenticate

def edit
@user = User.find(params[:id])
end

def update
if @user.update_attributes(params[:user])
flash[:success] = “Uaktualniono profil #{@user.id}”
redirect_to @user
else
render :edit, :id => @user.id
end
end

private

def authenticate
  deny_admin_access unless (signed_in? && current_user.admin)
end[/code]

Żądanie GET edit wykonuje się poprawnie, natomiast do POST update dociera jakby pusty obiekt @user.
edit.html.erb:

<%= content_tag :h3, "Edytuj użytkownika #{@user.name} (#{@user.email})" %> <%= semantic_form_for @user, :url => admin_user_path(@user.id) do |f| %> <%= f.inputs do %> <%= f.input :admin, :as => :boolean %> <%= f.input :name %> <%= f.input :email %> <%= f.input :password %> <%= f.input :password_confirmation %> <% end -%> <%= f.buttons do %> <%= f.commit_button :label => "Uaktualnij" %> <% end -%> <% end -%>
W routes.rb mam:

namespace "admin" do root :to => "pages#index" resources :users end
Efektem jest to, że otrzymuję błąd undefined method `update_attributes' for nil:NilClass
Co może być nie tak?

Zacznij metodę update tak:

def update @user = User.find(params[:id]) if @user.update_attributes(params[:user])

Myślałem o takim rozwiązaniu, jednak pisząc ten kontroler wzorowałem się na kontrolerze users z trzonu aplikacji. Tam to wygląda tak:
users_controller.rb

def edit @title = t('app.titles.edit_user') end ... def update respond_to do |format| if @user.update_attributes(params[:user]) format.html { flash[:success] = t('app.messages.updated_user') redirect_to(@user) } format.xml { head :ok } else format.html { @title = t('app.titles.edit_user') render 'edit' } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end
I wszystko działa jak należy. Żadnych inicjalizacji. Magia świąt czy co?

Pokaż CAŁY kontroler, możliwe, że wykorzystujesz (nieświadomie) before_filter albo coś.

Oj, faktycznie. Przed akcjami :edit i :update wykonuje się correct_user:

def correct_user @user = User.find(params[:id]) redirect_to(session[:return_to] || root_path, :notice => t('app.messages.bad_user')) unless current_user?(@user) end
Dziękuję za wyjaśnienie problemu

[quote=bfo]Witam
Projektuję panel administracyjny dla aplikacji i chcę, żeby tylko użytkownicy ze statusem admin mieli tam wejście[/quote]
proponuje zapoznac sie z tym http://github.com/ryanb/cancan