Question

Recently, I decided to split my User Form into an Edit & Account Form.

User Edit Form

-Name
-Username
-AboutMe

User Account Form

-Email
-Password
-Password Confirmation

The routes work fine and everything gets updated accordingly. But for some reason, when my User Model validates the Email Presence & it Fails, it renders the Edit Form with the appropriate Error Messages as oppose to the Account Form.

How can I set up my Update Method in my Controller to know which form to Render with the appropriate error messages?

Model

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :username

  validates :username, :presence   => true,
                     :length     => { :maximum => 15 },
                     :format     => { :with => VALID_UNAME_REGEX },
                     :uniqueness => { :case_sensitive => false }

  validates :email, presence:   true,
                format:     { with: VALID_EMAIL_REGEX },
                uniqueness: { case_sensitive: false }

  validates :password, presence: true, length: { minimum: 6 }, :if => :password #only validate if password changed!
  validates :password_confirmation, presence: true, :if => :password

end

Views

Edit View

<%= form_for @user, :html => { :multipart => true } do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

  <div class="statictitle">Your Profile</div>

    <%= f.text_field :username, placeholder: "Username..", :class => "form-control" %>

    <%= f.text_field :name, placeholder: "Name", :class => "form-control" %>

    <%= f.text_area :bio, placeholder: "About yourself in 160 characters or less...", class: "textinput" %>

  <%= f.submit "Update Profile", class: "btn btn-primary" %><br>

<% end %>

Account View

<%= form_for @user, :html => { :multipart => true } do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

  <div class="statictitle">Your Account</div>

    <%= f.text_field :email, placeholder: "Email", :class => "form-control" %>

    <%= f.password_field :password, placeholder: "Password", :class => "form-control" %>

    <%= f.password_field :password_confirmation, placeholder: "Password Confirmation", :class => "form-control" %>

  <%= f.submit "Update Account", class: "btn btn-primary" %><br>

<% end %>

Controller

class UsersController < ApplicationController

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

  def account
    @title = "Account"
    @user = User.find_by_username(params[:id])
  end

  def update
    @user = User.find(current_user.id)
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      sign_in @user
      redirect_to user_url
    else
      render 'edit'      ###I can't seem to figure out how to render the correct form
    end
  end

end

Routes

resources :users do
  member do
    get :account
  end  
end
Était-ce utile?

La solution

You can check the HTTP Referer in this case which will tell you where the request came from and accordingly render your view. for eg:

if URI(request.referer).path == edit_user_path 
  render :edit
else
  render :account
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top