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
Was it helpful?

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top