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
Post a Comment