【问题标题】:Rails - Updating Attribute/Column (pushing new song to a playlist array)Rails - 更新属性/列(将新歌曲推送到播放列表数组)
【发布时间】:2014-05-14 06:52:35
【问题描述】:

我有以下代码(工作)来创建播放列表:

控制器:

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。我正在使用预先输入的用户输入播放列表名称的方式,在选择名称后,它将使用播放列表 ID 填充隐藏的 ID 字段(如果有多个具有相同名称的播放列表)。如有必要,我将在此处包含完整的预输入代码。我正在尝试按照以下方式更新播放列表(基于这个较早的问题:Problems keeping an object in an array, Ruby issues and Rails issues

我的主要问题是试图将用户选择的播放列表的 ID 传递给 rails 表单,(rails 是服务器端,并且没有像 jQuery 这样的客户端方法来获取文本字段值的能力,据我所知) . update_attributeupdate_column 方法似乎仅限于通过(name, value),我不知道如何通过ID,因此我可以将新歌曲推送到现有的播放列表content 数组。

【问题讨论】:

  • 需要注意的一点:create 实际上创建了一条记录。您可能不希望在您的 form_for 中发生这种情况。
  • 是的,对于我在控制器中的def update,我有@playlist = Playlist.find(params[:id]),但是我选择了:id 客户端,带有预输入+ JSON,并且我在传递ID 时遇到了困难进入form-for。我尝试将隐藏字段放在 form_for 助手之前,这样我可以将 ID 作为参数传递,但会出现各种错误(例如 2 的 0 参数,或找不到 ID=id)。

标签: jquery ruby-on-rails activerecord form-for update-attributes


【解决方案1】:

将您在客户端收集的 ID 传递到一个

f.hidden_field 

在您的表单中。然后它将与其他参数一起提交给控制器。

如果您希望 update_attributeupdate_column 获得 ID,您可能会错误地使用它们。进入控制器后,update_attribute 用于将数据更新到模型中,而不是从表单中检索数据。

编辑:正如聊天中所讨论的,一种实现您想要实现的目标(即从单个表单创建和更新)的方法是在您的 AJAX 调用之后使用播放列表 ID 填充一个隐藏字段以检查如果播放列表已经存在。

当它到达您的控制器时,您可以使用此 ID 作为确定是创建新播放列表还是更新现有模型的基础。

使用同一页面搜索播放列表然后创建或更新的一个困难是,在更新现有播放列表的情况下,您可能需要进行适当的调用以使用预先存在的歌曲列表更新表单,并且播放列表详情。

【讨论】:

  • 是的,我应该更清楚一点,我已经有一个隐藏的 ID 字段,我的问题是我无法弄清楚如何将隐藏字段中的值传递到控制器中进行更新具有特定 ID 的播放列表。我正在使用 typeahead + JSON 来创建一个 .json 页面,其中包含用于 typeahead 输入的适当值,但因为这是客户端,我不知道如何将它传递到我想要更新列的 rails 表单中对于具有特定 ID 的播放列表。
  • 您需要进行某种形式的回发。如果您在表单上将其设置为隐藏字段,那么一旦用户提交表单,控制器就可以使用它。即参数['my_hidden_​​field']。如果您尚未提交该表单,那么您很可能需要某种 AJAX 回传,这是想象您的页面的另一种方式。
  • 如果我尝试传递类似form_for(@playlist[params[:hiddenField]]) 的内容,我会得到undefined method []' for nil:NilClass`。我确实考虑过 AJAX 回帖,但我想它需要对页面的工作方式进行彻底检查,就像你说的那样。
  • 如果你能进入我们可以讨论的聊天室 - 这不是你想要的参数 - chat.stackoverflow.com/rooms/5676/ruby-on-rails
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多