简体   繁体   中英

Ruby on Rails: How to extract URL parameter and insert the value inside a variable

I need to extract a parameter from my url and insert it into my database for a referral system.

Let's say this user, which is id = 1 has shared his link with another user, the url would be:

https://www.example.com/signup?referredBy=1

When the new user creates his account, I want the field referredBy to be assigned with the value from the referredBy parameter, which should be an Integer.

I've tried to do

@user.referredBy = [:referredBy]

But it didn't worked out.

Any help is appreciated.

Thank you so much.

EDIT

My index.html.erb is:

<% if current_user %>
  Logged in as <%= current_user.nomeUsuario %>
  <%= link_to "Log out", logout_path %>
<% end %>

<p id=”notice”><%= notice %></p>

<% else %>
  <%= link_to "Sign up", signup_path %>
  <%= link_to "Log in", login_path %> 
<% end %>

My new.html.erb is:

<h1>New User</h1>

<% if current_user %>
  <% controller.redirect_to root_url %>
<% else %>
  
  <%= render 'form', user: @user %>
  <%= link_to 'Back', login_url %>
<% end %>

My _form.html.erb is:

<%= form_with(model: user) do |form| %>
  <% if user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
        <% user.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :name, "Full Name" %>
    <%= form.text_field :nomeUsuario %>
  </div>

  <div class="field">
    <%= form.label :name, "E-mail" %>
    <%= form.text_field :email %>
  </div>

  <div class="field">
    <%= form.label :name, "Password" %>
    <%= form.password_field :password %>
  </div>

  <div class="field">
    <%= form.label :name, "Password Confirmation" %>
    <%= form.password_field :password_confirmation %>
  </div>

  <div class="field">
    <%= form.label :name, "Tipo do Plano" %>
    <%= form.select :tipoPlano, ["Gratuito", "Mensal", "Anual"], selected: "Gratuito" %>
  </div>

  <%= form.hidden_field :indicadoPor, params[:indicadoPor] %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

My user_controller.rb is:

class UsersController < ApplicationController
  before_action :set_user, only: %i[ show edit update destroy ]

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users or /users.json
  def create
    @user = User.new(user_params)
    set_tipoPlano
    @user.indicadoPor = params[:indicadoPor]
    respond_to do |format|
      if @user.save
        format.html { redirect_to root_url, notice: "User was successfully created." }
        format.json { render root_url, status: :created, location: @user }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /users/1 or /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        set_tipoPlano
        format.html { redirect_to root_url, notice: "User was successfully updated." }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation, :nomeUsuario, :tipoPlano, :valorPlano, :indicadoPor, :comissaoAcumuladaAtual, :comissaoASerRetirada)
    end

    def set_tipoPlano
      if(@user.tipoPlano == "Gratuito")
        @user.valorPlano = 0.0
      
      elsif(@user.tipoPlano == "Mensal")
        @user.valorPlano = 49.90
      
      elsif(@user.tipoPlano == "Anual")
        @user.valorPlano = 39.90
      end
    end
end

If you need something else, please let me know! Thank you so much for the help.

ANSWER BELOW

I've fixed it.

I just had to change my form to:

<%= form.hidden_field :indicadoPor, value: params[:indicadoPor] %>

I forgot the = , so the form wasn't being rendered. Also, I've removed the @user.referredBy = params[:referredBy] from my controller. Everything is fine now.

Thank you guys, gals and non-binaries for the help so far!

[:referral]

This is an array with a single value. That value is a symbol :referral . I'm not sure what type your referredBy column is but it's almost certainly going to complain about being given an array of symbols.

You want

params[:referral]

params is a hash like object containing the params in the url/(and sometimes body). So params[:referral] looks up the :referral symbol in the params hash and returns whatever the user provided.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM