Как отправить более одного флажка в форме HTML? - PullRequest
0 голосов
/ 28 августа 2018

Это проект для школы, и до сих пор я знаю только Ruby, Sinatra, HTML & CSS. Я посмотрел онлайн, но натолкнулся только на PHP и Javascript (которые я пока не должен использовать).

У меня есть форма для флажков, и, хотя я могу отметить более одного, только одно из значений флажка публикуется. Как получить, чтобы все проверенные были пройдены?

Кроме того, «аббревиатура» выходит ноль для каждого штата. Я делаю это неправильно в моей форме? И если что-нибудь, он просто использует одну из аббревиатур и добавляет ее в каждый штат. Наконец, как мне сделать так, чтобы флажки оставались отмеченными для состояний, которые пользователи уже добавили в прошлом?

Вот код:

<form method="POST" action="/states">
<h3>Northeast:</h3> <br>
<input type="checkbox" name="state_name" value="Connecticut" name="abbreviation" value="CT"> Connecticut<br>
<input type="checkbox" name="state_name" value="Deleware" name="abbreviation" value="DE"> Deleware <br>
<input type="checkbox" name="state_name" value="Maine" name="abbreviation" value="ME"> Maine<br>
<input type="checkbox" name="state_name" value="Maryland" name="abbreviation" value="MD"> Maryland<br>

require 'pry'
class StatesController < ApplicationController

  get '/states' do
    if logged_in?
        @user = current_user
        @states = current_user.states
      erb :'states/states'
    else
      redirect to '/login'
    end
  end


  get '/states/new' do
    if logged_in?
      erb :'/states/create'
    else
      redirect to '/login'
    end
  end

  post '/states' do
      if logged_in? && params[:state_name] != ""
        @state = State.create(:state_name => params[:state_name], :abbreviation => params[:abbreviation])
        # binding.pry
        @state.users << current_user
          if @state.errors.any?
              "Error, try again"
          else
            redirect "/states"
          end
      else
        redirect to "/states/new"
      end
    end


  get '/states/:id' do
    if logged_in?
      @state = State.find_by_id(params[:id])

        if @state != nil
          erb :'/states/show'
        else
          redirect to '/states'
        end
    else
      redirect to '/login'
    end
  end


  get '/states/:id/edit' do
    if logged_in?
      @state = State.find_by_id(params[:id])
      if @state && current_user
        erb :'states/edit'
      else
        redirect to '/states'
      end
    else
      redirect to '/login'
    end
  end


    patch '/states/:id' do
      @state = State.find_by_id(params[:id])
        if params[:state_name] != "" && @state.update(:state_name => params[:state][:state_name])
          @state.update(:state_name => params[:state][:state_name])
          redirect to "/states/#{@state.id}"
        else
          redirect to "/states/#{@state.id}/edit"
        end
    end

    delete '/states/:id/delete' do
      if logged_in?
        @state = State.find_by_id(params[:id])
          if @state && current_user
              @state.destroy
          end
        redirect to '/states'
      else
        redirect to '/login'
      end
  end
end

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я всегда знал, что в HTML-формах идентификаторы и имена должны быть уникальными, если только вы не работаете с переключателями или в этом случае флажками. Ваш код выглядит немного перегруженным, то есть у вас есть 2 имени и 2 значения на каждом флажке, и будет работать только последний из них обоих, поэтому вместо этого:

<input type="checkbox" name="state_name" value="Connecticut" name="abbreviation" value="CT"> Connecticut<br>

Попробуйте использовать только один из этих атрибутов:

<input type="checkbox" name="abbreviation" value="CT"> Connecticut<br />

Обычно, в для php мы добавляем '[]' в конце имени, и вы получите массив значений, которые были проверены. Но поскольку вы используете ruby, с которым я немного знаком, я видел, что разработчики ruby ​​предпочитают быть более выразительными в своем коде, и иногда они делают такие вещи:

<input type="checkbox" name="abbreviation[city_1]" value="CT">Connecticut<br />
<input type="checkbox" name="abbreviation[city_2]" value="DE">Delaware<br />

и т. Д.

Вы можете увидеть пример этого, здесь , хотя я верю, что вы можете сделать это с пустым '[]', но просто чтобы вы знали, что мне сказали, что это php-ish способ сделать это.

Ура!

0 голосов
/ 28 августа 2018

Вам необходимо добавить [] к вашему атрибуту имени для поддержки значения массива, то есть более одного проверенного значения:

<input type="checkbox" name="state_name[]" value="Connecticut"> Connecticut<br>
<input type="checkbox" name="state_name[]" value="Deleware"> Deleware<br>
<input type="checkbox" name="state_name[]" value="Maine"> Maine<br>
<input type="checkbox" name="state_name[]" value="Maryland"> Maryland<br>

Теперь на вашем сервере вы увидите проверенные значения как state_name: ['Connecticut', 'Maine', ...].

Примечание. Вы указали атрибуты name и value дважды для каждого флажка. Я использую первый.

0 голосов
/ 28 августа 2018

Используйте только одно имя и значение для каждого ввода, например:

<input type="checkbox" name="state_name" value="CT"> Connecticut<br><input type="checkbox" name="state_name" value="DE"> Deleware <br><input type="checkbox" name="state_name" value="ME"> Maine<br><input type="checkbox" name="state_name" value="MD"> Maryland

Проверьте ваш POST-массив на имя_состояния, и они должны быть массивом всех выбранных флажков.

...