ruby - Rails 4: How do I prevent logged in user to impute email at checkout? -


i following tutorial practice , found odd issue. way setup, guest can create shopping cart. once @ checkout, user has input personal info including email register him mailing info.

once user this, he/she gets email stating order , set password new account using email setup @ checkout. problem is, if same user logged in goes checkout item... have input same information including new email create new account, , cycle continues.

the account email setup @ last checkout, taken , have input new email. can see how odd is, theres continuous setting of new account whenever wants checkout account.

i prevent once user setups account, dont have setup new account go through checkout. can done problem? appreciated, thank you.

<h1>checkout</h1> <h2>you checking out following products:</h2> <ul>   <% @cart.items.each |item| %>     <li>       <em>         <%= item.quantity %>       </em>       <%= item.product.name %>       <%= number_to_currency item.total_price %>     </li>   <% end %> </ul> <p>   <strong>     total price:     <%= number_to_currency @cart.total_price %>   </strong> </p> <%= form_for @order_form, url: orders_path |f| %>   <%= render "orders/errors" %>   <h3>some of personal details</h3>   <%= f.fields_for :user, f.object.user |u| %>     <div class="form-group">       <p>         <%= u.text_field :name, placeholder: "name", class: "form-control input-lg" %>       </p>       <p>         <%= u.text_field :email, placeholder: "email", class: "form-control" %>         <span class="help-block">this track order more effectively.</span>       </p>     </div>     <div class="form-group">       <div class="row">         <p class="col-md-6">           <%= u.text_field :address, placeholder: "address", class: "form-control" %>         </p>         <p class="col-md-3">           <%= u.text_field :postal_code, placeholder: "postal code / zipcode", class: "form-control" %>         </p>         <p class="col-md-3">           <%= u.text_field :city, placeholder: "city", class: "form-control" %>         </p>       </div>       <p>         <%= u.country_select :country, { priority_countries: [ "gb", "us", "de", "es", "pt" ] }, { class: "form-control" } %>       </p>       <p>         <%= u.text_field :phone, class: "form-control", placeholder: "phone" %>       </p>     </div>   <% end %>   <div id="dropin"></div>   <p>     <%= f.submit "place order", class: "btn btn-primary" %>   </p> <% end %> <script>    braintree.setup("#{@client_token}", 'dropin', {     container: 'dropin'   });  </script> 

class ordertransaction    def initialize order, nonce     @order = order     @nonce = nonce   end    def execute     @result = braintree::transaction.sale(       amount: order.total_price,       payment_method_nonce: nonce     )   end    def ok?     @result.success?   end    private    attr_reader :order, :nonce end 

class user < activerecord::base   # include default devise modules. others available are:   # :confirmable, :lockable, :timeoutable , :omniauthable   devise :database_authenticatable, :registerable,          :recoverable, :rememberable, :trackable, :validatable    validates_presence_of :name, :address, :city, :country, :postal_code    def full_address   <<eof #{address} #{postal_code} #{city} #{country} eof   end end 

class orderscontroller < applicationcontroller   before_filter :initialize_cart    def index     @orders = order.order(created_at: :desc).all   end    def create     @order_form = orderform.new(       user: user.new(order_params[:user]),       cart: @cart     )      if @order_form.save       notify_user       if charge_user         redirect_to root_path, notice: "thank placing order."       else         flash[:warning] = <<eof order id #{@order_form.order.id}. <br/> went wrong. eof         redirect_to new_payment_order_path(@order_form.order)       end     else       render "carts/checkout"     end   end    def update     @order = order.find params[:id]     @previous_state = @order.state      if @order.update state_order_params       notify_user_about_state       redirect_to orders_path, notice: "order updated."     end   end    def new_payment     @order = order.find params[:id]     @client_token = braintree::clienttoken.generate   end    def pay     @order = order.find params[:id]     transaction = ordertransaction.new @order, params[:payment_method_nonce]     transaction.execute     if transaction.ok?       redirect_to root_path, notice: "thank placing order."     else       render "orders/new_payment"     end   end    private    def notify_user     @order_form.user.send_reset_password_instructions     ordermailer.order_confirmation(@order_form.order).deliver   end    def notify_user_about_state     ordermailer.state_changed(@order, @previous_state).deliver   end    def order_params     params.require(:order_form).permit(       user: [ :name, :phone, :address, :city, :country, :postal_code, :email ]     )   end   def charge_user(order)  transaction = ordertransaction.new order, params[:payment_method_nonce]  transaction.execute  transaction.ok?  end    def state_order_params     params.require(:order).permit(:state)   end end 

class ordermailer < actionmailer::base     default from: "sxxxxxx@gmail.com"    def order_confirmation order     @order = order     mail to: order.user.email, subject: "your order (##{order.id})"   end    def state_changed order, previous_state     @order = order     @previous_state = previous_state      mail to: order.user.email, subject: "your order (##{order.id}) has changed!"   end  end 

remove input view, if statement similar 1 in controller.

have @ devises, user_signed_in? or current_user methods.

also in first controller proceed this

def create      order_user == user_signed_in? ? current_user : user.new(order_params[:user])      @order_form = (       user: order_user,       cart: @cart     ) [...] 

Comments