だから私はログイン、メールアドレス、パスワード、パスワード確認、名前、アバター(写真)などのユーザーモデルを持っています。最初の5つには検証があり、基本的に5つすべてが存在する必要があると述べています。新しいモデル。
ただし、これにより、更新に関する問題が発生します。
ユーザーが自分の名前とアバターのみを編集できる編集ページがあります。現在、ログインを変更させるつもりはありません。別のページからメールアドレスとパスワードを変更したいと思います。
したがって、編集フォームは次のようになります。
<% form_for @user, :html => { :multipart => true } do |u| %>
<p>
<label>Name:</label>
<%= u.text_field :name %>
</p>
<p>
<label>Avatar:</label>
<%= display_user_avatar %>
<%= u.file_field :avatar%>
</p>
<p>
<%= submit_tag %>
</p>
<% end %>
を実行しようとすると、@user.update_attributes(params[:user])
パラメータが2つしかないため、更新は失敗します。これは、エントリの検証にパスワード、パスワード確認、電子メールなどが必要であり、それらがそのフォームに存在しないためです。name
avatar
を実行することでこれを回避できます@user.update_attribute(:name, params[:user][:name])
が、検証を回避することがGoodThing™であるかどうかが心配です。特にパスワードの更新のようなものに関しては、新しいパスワードを検証する必要があります。
別の方法はありますか?
そして、単にupdate_attribute forとを使用してこれを行うとしたら、どうすればよいでしょうか。:name
:avatar
これは機能しますか?
params[:user].each do |attribute|
@user.update_attribute(attribute, params[:user][attribute])
end
これはこれを行うための許容できる方法ですか...?
--フォローアップとして編集--Okie
、私はあなたが提案したように試しました
def update
@user = User.find_by_login(params[:id])
if @user.update_attributes!(params[:user])
redirect_to edit_user_path(@user)
else
flash[:notice] = @user.errors
redirect_to edit_user_path(@user)
end
end
つまり、!
バージョンを実行していて、ブラウザにキャッチされて表示される例外は次のとおりです。
Validation failed: Password is too short (minimum is 5 characters)
サーバーログの情報は次のとおりです。
Processing UsersController#update (for 127.0.0.1 at 2010-07-18 11:56:59) [PUT]
Parameters: {"user"=>{"name"=>"testeeeeee"}, "commit"=>"Save changes", "action"=>"update", "_method"=>"put", "authenticity_token"=>"BMEGRW/pmIJVs1zlVH2TtZX2TQW8soeCXmMx4kquzMA=", "id"=>"tester", "controller"=>"users"}
うーん。これを見て、提出していることに気づきました"id"=>"tester"
。これで、user_idではなくユーザーのログイン名が表示されるようにルートを設定しました...それが理由でしょうか?でユーザーの更新を見つけようとしていますuser_id == tester
が、存在しないため、代わりに作成しようとしていますか?それは実際に私がルートのために間違っていることですか?
うーん...レーキルートは、ルートが次のとおりであることを教えてくれます:
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
user.rb
そして、私はファイルにそのようなルートを設定しました:
def to_param
"#{login}"
end
しかし、それはこの間ずっとlogin
ではなく、間違いなく表示されています。id
しかし、私はまた、更新アクションの最初に、を実行してから@user = User.find_by_login(params[:id])
、それを更新してい@user
ます。
私はとても混乱しています。>。<
2番目の更新:
私のUser.rb
検証は次のとおりです。
validates_length_of :login, :within => 3..20
validates_length_of :password, :within => 5..20
validates_presence_of :login, :email, :password, :password_confirmation, :salt, :name, :on => :create
validates_uniqueness_of :login, :case_sensitive => false
validates_confirmation_of :password
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "format is invalid."
attr_accessor :password, :password_confirmation
そして、hashed_passwordセクションはここにあります:
def password=(pass)
@password = pass
self.salt = User.random_string(10) if !self.salt?
self.hashed_password = User.encrypt(@password, self.salt)
end
u.attributes
私にくれます
>> u.attributes
=> {"salt"=>"NHpH5glxsU", "name"=>"test er", "avatar_updated_at"=>nil, "updated_at"=>Sat Jul 17 07:04:24 UTC 2010, "avatar_file_size"=>nil, "avatar_file_name"=>nil, "hashed_password"=>"84f8675c1ed43ef7f8645a375ea9f867c9a25c83", "id"=>1, "avatar_content_type"=>nil, "login"=>"tester", "email"=>"tester@tester.com", "created_at"=>Fri May 07 10:09:37 UTC 2010}
うーん...わかりました。仮想属性password
が実際には存在しないことについて、あなたが言ったことです...では、どうすればそれを回避できますか?バガー、ここで私は自分の認証コードを賢くいじっていると思った...
これらの認証プラグインの1つに変更するのは簡単ですか?新しいユーザーモデルを作成する必要がありますか?または、プラグインは現在のプラグインで動作できる必要がありますか?
これまでのすべての助けに感謝します、ところで!:D