Bind two pages by form_tag

Hello !

I try to bind two pages together, a page which serves to make a research and a page which posts the result of the research.

Here are two pages that I want to bind together :

http://zupimages.net/up/14/05/0efm.png (Index)
http://zupimages.net/up/14/05/901g.png (Show)

And here is what it currently gives me when I press the Search button :

http://zupimages.net/up/14/05/cr2r.png (Index)
http://zupimages.net/up/14/05/f2mn.png (Show)

Here is the code of the two pages:

Index.html.erb :

<h1>Search counter</h1>
<%= form_tag '/counters/id', method: :get %>
<table>
    <tr>
      <th>Identifiant</th>
      <th><%= search_field_tag "counters" %></th>
      <th><%= submit_tag 'Search' %></th>
      <th></th>
    </tr>
</table>

Show.html.erb :

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

<p>
  <strong>Nombre de message :</strong>
  <%= @counter_msg %> </br>

  <strong>Maximum de message pouvant être envoyé :</strong>
  <%= @counter_max %> </br>

  <strong>Reset automatique :</strong>
  <%= @counter_reset %> </br>

  <strong>Date du dernier reset :</strong>
  <%= @counter_reset_date %> </br>
</p>

<%= link_to 'Edit', edit_counter_path(@counter) %> |
<%= link_to 'Back', counters_path %>

I would like to have your help to know where the problem comes from and how I could fix it. (I think this is a story of road, but being a beginner I do not know)

Thank you in advance for your help

could you provide the counters_controller.rb code? Seems that your variable raw_counter is not set properly…

Here is the counters_controller.rb code :

class CountersController < ApplicationController

#require ‘colorize’

before_action :get_counter, only: [:show, :edit, :update, :destroy]

GET /counters

GET /counters.json

def index

end

GET /counters/1

GET /counters/1.json

def show

raw_counter = REDIS.hget(params[:id], 'c')
raw_counter_reset = REDIS.hget(params[:id], 'overquota_reset_c')
raw_counter_reset_date = REDIS.hget(params[:id], 'overquota_reset_at')
#@counter_max = 'put'.red
#@counter_msg.red
@counter = {:id => params[:id]}
if raw_counter == '0'
  @counter_msg = '0'
  @counter_max = '0'
else
  @counter_msg = raw_counter[9..17]
  @counter_max = raw_counter[1..6]
  #if @counter_msg > @counter_max
  #end
end
if raw_counter_reset == "1"
  @counter_reset = 'oui'
else
  @counter_reset = 'non'
end
@counter_reset_date = Time.at(raw_counter_reset_date.to_i)
respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @counter }
end

end

GET /counters/new

def new

@counter = Counter.new

end

GET /counters/1/edit

def edit

end

POST /counters

POST /counters.json

def create

@counter = Counter.new(counter_params)
respond_to do |format|
  if @counter.save
    format.html { redirect_to @counter, notice: 'Counter was successfully created.' }
    format.json { render action: 'show', status: :created, location: @counter }
  else
    format.html { render action: 'new' }
    format.json { render json: @counter.errors, status: :unprocessable_entity }
  end
end

end

PATCH/PUT /counters/1

PATCH/PUT /counters/1.json

def update

respond_to do |format|
  if @counter.update(counter_params)
    format.html { redirect_to @counter, notice: 'Counter was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: 'edit' }
  format.json { render json: @counter.errors, status: :unprocessable_entity }
  end
end

end

DELETE /counters/1

DELETE /counters/1.json

def destroy

@counter.destroy
respond_to do |format|
  format.html { redirect_to counters_url }
  format.json { head :no_content }
end

end

private

# Use callbacks to share common setup or constraints between actions.
def get_counter
  @counter = REDIS.hget(params[:id], 'c')
end
# Never trust parameters from the scary internet, only allow the white list through.
def counter_params
  #params.require(:counter).permit()
end

end

I don’t think the problem comes from contôler and raw_counter,

because when I replace :

<%= form_tag '/counters/id', method: :get %>

by:

<%= form_tag '/counters/ovm%3Ab%3A%7Bpausecho%7D%2Fmozilla', method: :get %>

of index.html.erb,the application works, and shows it :

http://zupimages.net/up/14/05/gogk.png

with this URL :

http://127.0.0.1:3000/counters/ovm%3Ab%3A{pausecho}%2Fmozilla?utf8=✓&counters=&commit=Search

I don’t think the problem comes from contôler and raw_counter,

because when I replace :

<%= form_tag '/counters/id', method: :get %>

by:

<%= form_tag '/counters/ovm%3Ab%3A%7Bpausecho%7D%2Fmozilla', method: :get %>

That’s because your controller is looking for params[:id], but your form tag is always setting it to ‘id’ (because the url is /counters/id), which presumable results in redis returning nil. (The value of your search field is in params[:counters])

It might also be prudent to check what is returned from redis before using it.

A form can’t change the path submitted to based on the fields submitted, so you either have to have some dummy value (if you want it to go to the show action), or else let it go to the index action, but if the :counters parameter is present, indicating that a search is being requested, then redirect to the appropriate show page.

Fred