Rails - Обновление атрибута/столбца (помещение новой песни в массив плейлистов)

У меня есть следующий код (работает) для создания плейлистов:

Контроллер:

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. Я использую ввод, когда пользователь вводит имя списка воспроизведения, и после выбора имени он заполняет скрытое поле идентификатора идентификатором списка воспроизведения (в случае нескольких списков воспроизведения с одинаковым именем). При необходимости я включу сюда полный код typehead. Я пытаюсь обновить список воспроизведения в следующих строках (на основе этого более раннего вопроса: Проблемы с сохранением объекта в массиве, проблемы Ruby и Rails )

Моя основная проблема заключается в попытке передать идентификатор списка воспроизведения, который пользователь выбирает, в форму рельсов (рельсы являются серверной стороной и не имеют возможности клиентских методов, таких как jQuery, для получения значения текстового поля, как я понимаю). Методы update_attribute и update_column, похоже, ограничены прохождением через (name, value), и я не могу понять, как передать идентификатор, чтобы я мог передать новую песню в существующий массив плейлиста content.


person Amir    schedule 12.05.2014    source источник
comment
На что следует обратить внимание: create фактически создает запись. Вероятно, вы не хотите, чтобы это происходило в вашем form_for.   -  person Michael Westbom    schedule 13.05.2014
comment
Да, для моего def update в контроллере у меня есть @playlist = Playlist.find(params[:id]), но я выбираю :id на стороне клиента с вводом текста + JSON, и у меня возникают трудности с передачей идентификатора в form-for. Я пробовал, чтобы скрытое поле предшествовало помощнику form_for, чтобы я мог передать идентификатор в качестве аргумента, но получаю различные ошибки (например, 0 аргументов вместо 2 или не могу найти ID=id).   -  person Amir    schedule 13.05.2014


Ответы (1)


Передайте идентификатор, который вы собираете на стороне клиента, в

f.hidden_field 

внутри вашей формы. Затем он будет передан контроллеру вместе с другими параметрами.

Возможно, вы неправильно используете update_attribute и update_column, если ожидаете, что они получат идентификатор. Когда вы находитесь в контроллере, update_attribute используется для обновления данных в модели, а не для извлечения данных из формы.

Редактировать: как обсуждалось в чате, один из способов сделать то, что вы пытаетесь достичь (т.е. создать и обновить из одной формы), — это иметь скрытое поле, которое вы заполняете идентификатором списка воспроизведения после вашего вызова AJAX, чтобы проверить, является ли список воспроизведения уже существует.

Когда он доберется до вашего контроллера, вы можете использовать этот идентификатор в качестве основы для определения того, создаете ли вы новый список воспроизведения или обновляете существующую модель.

Одна из трудностей при использовании одной и той же страницы для поиска списка воспроизведения, а затем его создания или обновления заключается в том, что в случае обновления существующего списка воспроизведения вам может потребоваться выполнить соответствующие вызовы для обновления формы с уже существующим списком песен и деталями списка воспроизведения.

person Dave Satch    schedule 12.05.2014
comment
Да, я должен был быть более ясным, у меня уже есть скрытое поле для идентификатора, моя проблема в том, что я не могу понять, как передать значение из этого скрытого поля в контроллер, чтобы обновить список воспроизведения с определенным идентификатором. Я использую typeahead + JSON для создания страницы .json с соответствующими значениями для ввода typeahead, но поскольку это на стороне клиента, я не знаю, как передать это в форму рельсов, где я хочу обновить столбец для списка воспроизведения с определенным идентификатором. - person Amir; 13.05.2014
comment
Вам нужно будет сделать некоторую форму обратной связи. Если вы установите его в форме как скрытое поле, оно будет доступно для контроллера после того, как пользователь отправит форму. то есть params['my_hidden_field']. Если вы еще не отправляете эту форму, вам, скорее всего, понадобится какой-то ответ AJAX, который представляет собой другой способ представить вашу страницу. - person Dave Satch; 13.05.2014
comment
Если я попытаюсь передать что-то вроде form_for(@playlist[params[:hiddenField]]), я получу undefined method []' вместо nil:NilClass`. Я думал о публикации AJAX, но я думаю, что, как вы сказали, потребуется капитальный ремонт того, как страница будет работать. - person Amir; 13.05.2014
comment
Если вы можете попасть в чат, мы можем обсудить - это не то место, где вы хотите, чтобы параметр был - chat.stackoverflow .com/rooms/5676/ruby-on-rails - person Dave Satch; 13.05.2014