如何将一列中的数据显示为多个输入?

时间:2015-02-28 11:38:04

标签: ruby-on-rails forms

我在一个应用程序上工作,我有一个带有电影的模型'属性(前5部电影)。当用户尝试编辑前5部电影时,我想用不同的输入显示每部电影,但我不知道该怎么做(因为所有5部电影代表一个单一属性)

在我的控制器中

def show
  @user = User.find(params[:id])
  @user.movies = @user.movies.split(',')
end

在我看来

<%= form_for @user do |f| %>
  <%= f.label :movies %>
  <%= f.text_field :movies[0] %>
  .
  .
  .
  <%= f.label :movies %>
  <%= f.text_field :movies[4] %>
<% end %>

当然,这不起作用!

1 个答案:

答案 0 :(得分:2)

您可以在User模型中添加使用虚拟属性来处理此问题,如下所示:

class User < ActiveRecord::Base
  def movies_list
    movies.split(',')
  end

  def movies_list=(list)
    self.movies = list.join(',')
  end
end

然后在您的控制器中,您只需:

def show
  @user = User.find(params[:id])
end

在您看来,您可以像这样处理您的表单:

<%= form_for @user do |f| %>
  <%= f.label :movies %>

  <%- @user.movies_list.each do |movie| %>
    <%= text_field_tag 'user[movies_list][]'  %>
  <% end %>
<% end %>

这将允许update上的users_controller操作访问params[:user][:movies_list]中的电影数组,模型将理解并处理。

最后,如果需要,请不要忘记将:movies_list添加到控制器上允许的参数上。

编辑:感谢评论中的@BroiSatse,作为text_field_tag语法的替代方法,您可以使用表单构建器f.text_field :movies_list, multiple: true, value: movie