Vue Multiselect не передает значение идентификатора (Rails API)
Мое приложение представляет собой бэкэнд Rails API и VueJS через внешний интерфейс Nuxt.
У меня есть форма, где один из входов является выбором, и я использую https://vue-multiselect.js.org/. Опции выбора - это значения из другой таблицы, где я хочу отобразить поле имени, но отправить идентификатор.
Я могу отобразить параметры в выпадающем окне хорошо, и я также отправляю другие значения в форме, но идентификатор не работает.
Консоль Rails показывает ошибку distillery_id
не разрешенный параметр, хотя у меня есть этот набор в контроллере.
Started POST "/api/v1/gins" for ::1 at 2019-02-01 13:25:38 +0000
Processing by Api::V1::GinsController#create as HTML
Parameters: {"gin_name"=>"distillery_id", "description"=>"distillery_id should be submitted", "distillery_id"=>{"id"=>3, "distillery_name"=>"Gordon's", "snippet"=>nil, "description"=>nil, "website"=>nil, "country"=>"United Kingdom", "created_at"=>"2019-01-29T13:46:15.088Z", "updated_at"=>"2019-01-29T13:46:15.088Z", "slug"=>nil}, "abv"=>"0", "snippet"=>"distillery_id now?", "gin"=>{"gin_name"=>"distillery_id", "snippet"=>"distillery_id now?", "description"=>"distillery_id should be submitted", "abv"=>"0", "distillery_id"=>{"id"=>3, "distillery_name"=>"Gordon's", "snippet"=>nil, "description"=>nil, "website"=>nil, "country"=>"United Kingdom", "created_at"=>"2019-01-29T13:46:15.088Z", "updated_at"=>"2019-01-29T13:46:15.088Z", "slug"=>nil}}}
Unpermitted parameter: :distillery_id
gins_controller.rb
...
def gin_params
params.require(:gin).permit(:gin_name, :alcoholic, :snippet, :description, :abv, :distillery_id)
end
...
new.vue
<template>
<section class="container">
<div>
<h1>Gins</h1>
<form @submit.stop.prevent="addGin">
<h2>New Gin</h2>
<p>
<label for="gin_name" class="input-label">Title:</label>
<input id="gin_name" v-model="gin_name" type="gin_name" name="gin_name" class="input">
</p>
<p>
<label for="snippet" class="input-label">Snippet:</label>
<input id="snippet" v-model="snippet" type="text" name="snippet" class="input">
</p>
<p>
<label for="description" class="input-label">Description:</label>
<input id="description" v-model="description" type="textarea" name="description" class="input">
</p>
<p>
<label for="abv" class="input-label">ABV%:</label>
<input id="abv" v-model="abv" type="number" name="abv" class="input">
</p>
<div>
<label for="distillery_id" class="input-label">Distillery:</label>
<multiselect
v-model="distillery_id"
track_by="distillery_id"
:options="options"
:searchable="true"
placeholder="Choose One Distillery"
:custom-label="label"
>
</multiselect>
</div>
<p>
<input type="submit" value="Submit" class="button">
</p>
</form>
</div>
</section>
</template>
<script>
import axios from 'axios'
import Multiselect from 'vue-multiselect'
export default {
components: { Multiselect },
data() {
return {
gin_name: '',
snippet: '',
description: '',
abv: '',
distillery_id: '',
options: []
}
},
mounted() {
this.getDistilleries()
},
methods: {
label(option) {
return `${option.distillery_name}`
},
addGin() {
axios.post('http://localhost:4000/api/v1/gins', {
gin_name: this.gin_name, description: this.description, distillery_id: this.distillery_id, abv: this.abv, snippet: this.snippet
})
.then((response) => {})
console.log()
},
getDistilleries(req) {
axios.get('/api/v1/distilleries')
.then((res) => {
this.options = res.data
})
.catch((error) => {
console.log(error)
})
}
}
}
</script>
<style src="vue-multiselect/dist/vue-multiselect.min.css"></style>
<style>
</style>
Основываясь на консоли, я подозреваю, что это проблема rails, а не vue, но это разрешенные параметры выглядит хорошо для меня.
Любые предложения, что еще может быть не так?
2 ответа
Внимание, это не проверено. Но, после быстрого просмотра документов VueMultiselect и вашего компонента Vue, создается впечатление, что v-модель вашего винокурни настроена на один объект спиртзавода. Который я полагаю, @UdAY показал в комментариях. Таким образом, ваши данные POST могут быть изменены на:
addGin() {
axios.post('http://localhost:4000/api/v1/gins', {
gin_name: this.gin_name,
description: this.description,
distillery_id: this.distillery_id.id, //this.distillery_id is being set as an object and you just need the id prop here
abv: this.abv, snippet: this.snippet
})
Вы пытались использовать фильтр, чтобы получить хорошие значения?
addGin() {
let myId = options.filter(o => distillery_id.some(d => d.distillery_id === o.distillery_id));
axios.post('http://localhost:4000/api/v1/gins', {
gin_name: this.gin_name,
description: this.description,
distillery_id: myId,
abv: this.abv,
snippet: this.snippet
}).then(console.log)
},
Я не думаю, что это работает, проверьте код перед использованием.
Другой способ - отладить код в строке и проверить, как вы можете получить идентификатор:
addGin(argument1, argument2, argument3) {
debugger; // The code will stop here, check this object to get the data and change the code!
axios.post('http://localhost:4000/api/v1/gins', {
gin_name: this.gin_name,
description: this.description,
distillery_id: this.distillery_id,
abv: this.abv,
snippet: this.snippet
}).then(console.log)
},
Я предлагаю изменить множественный выбор на vue-select. Документы кажутся более читабельными.
Надеюсь, поможет:)