如何以HTML表单提交多个复选框?

时间:2018-08-28 00:44:22

标签: html ruby model-view-controller sinatra sinatra-activerecord

这是一个学校项目,到目前为止,我只了解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 :(得分:0)

我一直都知道,以html格式显示的id和名称必须唯一,除非您使用单选按钮或本例中的复选框。您的代码似乎有点多余,这意味着,每个复选框上都有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的 in ,我们将在名称的末尾附加一个[[]”,您将收到一个已检查值的数组。但是由于您正在使用ruby(我对此有点熟悉),所以我已经看到ruby开发人员希望在他们的代码中更具表现力,有时他们会这样做:

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

以此类推。

您可以看到它的一个示例here,即使我相信您可以使用空的[[]]来做到这一点,但是您知道我被告知这是php-ish方式做吧。

干杯!

答案 1 :(得分:0)

您需要将[]附加到您的name属性以支持数组值,即多个检查值:

<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', ...]

注意:您为每个复选框指定了两次namevalue属性。我正在使用第一个。

答案 2 :(得分:-1)

每个输入仅使用一个名称和值,例如:

<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数组中的state_name,它们应该是选中的所有复选框的数组。