У меня есть следующий код (рабочий) для создания плейлистов:
контроллер:
def create
@playlist = current_user.playlists.build(playlist_params)
if @playlist.save
redirect_to root_url
else
redirect_to root_url
end
end
def destroy
end
private
def playlist_params
params.require(:playlist).permit(:content, :name)
end
Посмотреть:
<%= form_for(@user.playlists.create, remote:true) do |f| %>
<%= f.text_field :content, id: "playlistContent", :validate => true %>
<%= f.text_field :name, id: "playlistName", placeholder: "Enter Playlist Name", :validate => true %>
<%= f.submit "Save Playlist", id: "savePlaylist", remote:true %>
<% end %>
Теперь я хочу разрешить пользователю добавлять новую композицию в content
плейлиста. Я использую typeahead, где пользователь вводит имя списка воспроизведения, и, выбирая имя, он заполнит поле скрытого идентификатора идентификатором списка воспроизведения (в случае нескольких списков воспроизведения с тем же именем). Если необходимо, я включу здесь полный код типа. Я пытаюсь обновить список воспроизведения в следующих строках (на основе этого более раннего вопроса: проблемы с сохранением объекта в массиве, проблемы с Ruby и проблемы с Rails)
Моя основная проблема заключается в попытке пройти идентификатор плейлиста, который пользователь выбирает для формы рельсов (рельсы являются серверной частью и не имеют возможности клиентских методов, таких как jQuery, чтобы получить значение текстового поля, насколько я понимаю). update_attribute
и update_column
кажутся ограниченными для прохождения через (name, value)
, и я не могу понять, как пройти через идентификатор, чтобы я мог пропустить новую песню в существующий массив content
списка воспроизведения.
Передайте идентификатор, который вы собираете на стороне клиента, в
f.hidden_field
внутри вашей формы. Затем он будет передан контроллеру вместе с другими параметрами.
Возможно, update_column
неправильно используете update_attribute
и update_column
если ожидаете получить идентификатор. Когда вы находитесь в контроллере, update_attribute используется для обновления данных в модели, а не для извлечения данных из формы.
Изменение: Как обсуждалось в чате, один из способов сделать то, что вы пытаетесь достичь (т.е. Создать и обновить из одной формы), - это иметь скрытое поле, которое вы заполняете идентификатором списка воспроизведения после вызова AJAX, чтобы проверить, есть ли список воспроизведения уже существует.
Когда он попадает на ваш контроллер, вы можете использовать этот идентификатор в качестве основы для определения того, создаете ли вы новый плейлист или обновляете существующую модель.
Одна из трудностей с использованием одной и той же страницы для поиска списка воспроизведения, а затем создания или обновления заключается в том, что в случае обновления существующего списка воспроизведения вам может потребоваться сделать соответствующие звонки, чтобы обновить форму с уже существующим списком песен и подробностями списка воспроизведения.
create
создает запись. Вы, вероятно, не хотите, чтобы это происходило в вашейform_for
.def update
в контроллере у меня есть@playlist = Playlist.find(params[:id])
, но я выбираю:id
стороне клиента с typeahead + JSON, и где у меня возникают трудности при передаче идентификатора вform-for
. Я пытался, чтобы скрытое поле предшествовало помощникуform_for
чтобы я мог передать идентификатор в качестве аргумента, но получить различные ошибки (например, 0 аргументов для 2 или не могу найти ID = id).