我有一个ajax代码,只有当我为所有选择都选择选项时,它才起作用。
Select box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option didn't select)
result: code 500 (won't send data)
//////////////////////
Select Box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option selected)
result: code 200 (sending data)
<script defer>
$(document).ready(function() {
$('body').on("change", ".autosubspecifications", function() {
var form = $(this).closest('form');
var id = form.find('input[name="product_id"]').val();
// An array to store the subspecifications values.
var spec_array = [];
// A loop to go through all them.
form.find('select.autosubspecifications option:selected').each(function(){
spec_array.push($(this).val());
});
console.log(id);
$.ajax({
type: "post",
url: '{{ url('admin/spacssendto') }}',
data: {
'_token': $('input[name=_token]').val(),
'product_id': id,
'subspecifications': spec_array,
},
success: function (data) {
alert('Specifications added successfully.');
console.log($(this));
},
error: function (data) {
console.log(data);
}
});
});
});
</script>
如果我为两个或什至一个选择框选择选项时,将按照选择的数据发送代码200,而不是被迫为所有选择项选择值。
有什么主意吗?
这是我的后端(控制器)
public function spacssendto(Request $request)
{
$this->validate($request, array(
'product_id' => 'required',
'subspecifications' => 'required',
));
$product = Product::find($request->product_id);
$product->subspecifications()->sync($request->subspecifications, false);
}
同步方法
我的同步方法的作用是将product_id
和subspecification_id
存储到名为product_subspecification
的表中
database
how data are passing currently
作为我的网络响应(当我没有从所有选择框中选择选项时),我得到:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`u641790295_kargr`.`product_subspecification`, CONSTRAINT `product_subspecification_subspecification_id_foreign` FOREIGN KEY (`subspecification_id`) REFERENCES `subspecifications` (`id`)) (SQL: insert into `product_subspecification` (`product_id`, `subspecification_id`) values (21, ))
为了避免忽略子规范的空值并避免后端出错,我进行了一些更改,这是我当前的代码:
public function spacssendto(Request $request) {
$this->validate($request, array(
'product_id' => 'required',
'subspecifications' => 'required',
));
$product = Product::find($request->product_id);
$looped = $request->subspecifications;
$spec = [];
foreach($looped as $loope){
if($loope != ''){
$spec[] = $loope;
}
}
if(isset($spec)) {
$product->subspecifications()->sync($spec, false);
}
}
这样,我只能得到具有值的数组项(上面的图像2)。
到目前为止一切顺利,
sample
有什么主意,我该如何进行替换?
PS:默认情况下,sync方法会进行替换,但由于我已经 空值的问题,并提供了如果现在在我的控制器中,我迷路了 同步替换的功能。
答案 0 :(得分:0)
返回码500表示您的后端代码(在ajax调用之后)失败。 您可以执行以下任一操作:
1)在后端修复该代码以处理丢失的值,即,如果找不到所需的内容,请妥善处理该情况(例如使用默认值),以免失败
2),也可以通过填写缺失值在客户端(js)上执行相同操作。 像这样:
...
// A loop to go through all of selects.
form.find('select.autosubspecifications').each(function()
{
var selectedOption = $(this).val() || "sensible-default-value";
spec_array.push(selectedOption);
});
...
答案 1 :(得分:0)
对于(更新2)中的问题,此问题已解决了50%(更新1) 我提出了一个新问题 [here]