我在一个应用程序上工作,我有一个带有电影的模型'属性(前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 %>
当然,这不起作用!
答案 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