2010-09-01 7 views
0

Ok donc j'ai un problème avec faire plusieurs formes dans les rails. voici le code ci-dessousRails structure multiforme semble un peu hors

modèles

class Profile < ActiveRecord::Base 
    belongs_to :user 
    has_attached_file :avatar, :styles => { :medium => "134x137>", :thumb => "111x111>", :tiny => "32x38>" } 
    validates_attachment_content_type :avatar, :content_type => ['image/pjpeg','image/jpeg', 'image/x-png', 'image/png', 'image/gif'] 


class User < ActiveRecord::Base 
    has_one :profile, :dependent => :destroy 

Profil Contrôleur

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

Modifier les profils Voir

<% form_for @user do |f| %> 
<%= f.text_field :first_name %> 
<%= f.text_field :last_name %> 
<%= f.text_field :email %> 
<%= f.password_field :password %> 
<%= f.password_field :password_confirmation %> 
<input id="send_update" name="send" type="submit" value="Update" /> 
<% end %> 


<% form_for @profile , :html => { :multipart => true } do |f| %> 
<%= render :partial => 'form', :locals => {:f => f, :profile => @profile, :title => 'Edit Profile'} %> 
<%= submit_tag 'Update', :style => 'text_align:right'%> 
<% end %> 

Profil _form partielle

<label>Upload Avatar</label> 
<tr><%= f.file_field :avatar %></tr> 

Donc, fondamentalement, j'ai deux formes dans la vue de modifier et quand je clique sur la deuxième mise à jour pour mettre à jour l'avatar je vais à la mise à jour des utilisateurs et je reçois cette erreur flash « Désolé, quelque chose a mal tourné »

def update 
    @user = User.find(params[:id])  
    current_email = @user.email 
if @user.update_attributes(params[:user]) 
    UserMailer.deliver_email_changed (@user) if email_changed?(current_email, @user.email) 
    flash[:notice] = "<h1>Account updated!</h1>" 
    redirect_to edit_user_path(@user) 
else 
    flash.now[:error] = "Sorry, something went wrong" 
    render :action => :edit 
end 
end 

Mes questions sont ce

  1. y at-il une meilleure façon de structurer cela alors peut-être que j'ai une forme?
  2. Pourquoi ne pas économiser maintenant et quel est le problème?

Répondre

0

La méthode que vous utilisez pour mettre à jour est erroné, il est syntaxiquement invalide (vous manque un end). Il devrait être:

def update 
    @user = User.find(params[:id])  
    current_email = @user.email 
    if @user.update_attributes(params[:user]) 
    UserMailer.deliver_email_changed (@user) if email_changed?(current_email, @user.email) 
    flash[:notice] = "<h1>Account updated!</h1>" 
    redirect_to edit_user_path(@user) 
    else 
    flash.now[:error] = "Sorry, something went wrong" 
    render :action => :edit 
    end 
end 

Il devrait y avoir deux formes en effet, comme je devine que vous ne voulez pas l'une des valeurs d'un formulaire pour soumettre si l'utilisateur exécute l'autre action.

Maintenant, organisez vos contrôleurs. Vous appelez @user = User.find(params[:id]) sur votre ProfilesController, mais l'identifiant que vous transmettez est celui de l'utilisateur. Soit cela doit être sur le contrôleur de l'utilisateur, et mettre à jour le profil associé à partir de là, ou vous devriez recevoir l'id de l'objet de profil à la place.

J'irais avec le premier. Vous pouvez mettre à jour l'objet de profil d'un utilisateur à l'aide accepts_nested_attributes_for et vos formulaires serait comme:

<% form_for @user do |f| %> 
    <%= f.text_field :first_name %> 
    <%= f.text_field :last_name %> 
    <%= f.text_field :email %> 
    <%= f.password_field :password %> 
    <%= f.password_field :password_confirmation %> 
    <%= f.submit, :id => ... %> 
<% end %> 

<% form_for @user, :html => { :multipart => true } do |f| %> 
    <% f.fields_for :profile do |profile_form| %> 
    <%= render :partial => 'form', :locals => {:f => profile_form, :title => 'Edit Profile'} %> 
    <%= submit_tag 'Update', :style => 'text_align:right'%> 
    <% end %> 
<% end % 

Si l'erreur est que le mot de passe ne peut être vide, peut être due à un validates_presence_of :password, :password_confirmation.Vous devez utiliser un conditional validation il

0

Dépannage aiderait:

  1. Retirez le if/else et garder les @ user.update_attributes (params [: user]). Rails vous donnerait un message d'erreur plus détaillé.
  2. Vérifiez la structure du formulaire (source html), en particulier pour la dénomination du champ.
  3. Vérifiez les fichiers journaux des déclarations DB

HTH

+0

l'erreur est le mot de passe ne peut pas être vide mais je suis juste en train de mettre à jour l'avatar – Trace

Questions connexes