【问题标题】:How do I submit more than one checkbox in an HTML form?如何在 HTML 表单中提交多个复选框?
【发布时间】:2019-02-02 12:59:50
【问题描述】:

这是一个学校项目,目前我只知道 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

【问题讨论】:

  • 您的输入标签每个都有 2 个名称属性。他们应该只有一个。
  • 还有 2 个value 属性。
  • 但是当在我的一个视图中使用 state_name 和在另一个视图中使用缩写时,我如何区分这两个值?
  • 仅包含您提交此表单的操作。
  • 另一个问题,您真的在表单中硬编码州名和缩写吗?您已经有一个表states。您应该将所有状态名称和 abs 存储在那里,并通过迭代从该表中获取的列表来呈现表单。

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


【解决方案1】:

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

<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 属性。我正在使用第一个。

【讨论】:

  • 是的,但关键是它将状态发布在一个编号列表中,以显示用户去过哪些状态。所以我不想要一个数组。我只是希望它为每个选中的州发布单独的州名。
  • 不太清楚你的意思。对不起,我是初学者!
  • 为什么你不想在后端同时显示州名和缩写?你不能从另一个中找出一个吗?
  • 州名是最重要的,这是我想要的主要属性。但是,我还希望将状态与缩写相关联,以便在查看单个状态时遍历照片(以状态的缩写命名)以显示正确的状态照片。我是不是搞错了?
  • 这是我的存储库:github.com/cbronzo/travel_app ...我还没有提交我的主要更新,因为我一直在玩这个,但也许这会让你更好地了解什么继续。
【解决方案2】:

我一直都知道,在 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 />

通常,in 对于 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 />

等等。

你可以看到一个例子,here,尽管我相信你可以用空的 '[]' 来做,但是你知道我被告知这是 php-ish 的方法.

干杯!

【讨论】:

  • 谢谢,但我需要收集“缩写”和“州名”的两个参数。如果我只是做 name="abbreviation" 那么我失去了 state_name 值。这个想法是用户可以检查某些状态,它会返回他们检查的状态名称。我需要缩写来遍历以缩写命名的状态图片。
  • 那你看错了这个问题。你需要了解更多关于 html 的知识。正如我们告诉您的,只有您使用的最后一个属性将被发送,不可协商,这就是 html 的工作方式。我建议您阅读更多关于 html 以及 ids、classes、data-*、name、value 和 types 工作原理的内容。
  • 在我看来,您有一些选择: 1. 使用 javascript 来实现您所需要的,但您必须了解事件、dom 和 ajax(使用新的 api 获取)。 2. 请记住,我写的只是一个示例,您需要根据自己的需要对其进行调整,您可以执行以下操作:&lt;input type="checkbox" name="state_name[DE]" value="Delaware"&gt;Delaware&lt;br /&gt;,然后使用您的服务器语言对其进行处理。你会失去缩写部分,但你知道那些是什么。也许还有其他选择,但这取决于您要如何解决当前问题。
【解决方案3】:

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

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

【讨论】:

  • 仍将只向服务器传递一个值。
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 2021-10-29
  • 2013-01-05
  • 2021-06-25
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多