这是一个学校项目,到目前为止,我只了解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
答案 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', ...]
。
注意:您为每个复选框指定了两次name
和value
属性。我正在使用第一个。
答案 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,它们应该是选中的所有复选框的数组。