Rails 通过表单选择传递对象

neo*_*neo 1 ruby-on-rails

在我的表格中:

<%= f.select :user, User.all %>
Run Code Online (Sandbox Code Playgroud)

这会生成一个包含所有用户集合的选择。

当我点击提交时,它当前正在将对象作为字符串传递,如下所示:

[3] pry(#<PermissionFormsController>)> params[:permission_form][:user]
=> "John Doe <John.Doe@foo.com> - Bar (something)"
Run Code Online (Sandbox Code Playgroud)

[4] pry(#<PermissionFormsController>)> params[:permission_form][:user].class
=> String
Run Code Online (Sandbox Code Playgroud)

我更想得到这个对象,比如current_user

[5] pry(#<PermissionFormsController>)> current_user
=> Homer Simpson <homer@gmail.com> - Foo (admin)
Run Code Online (Sandbox Code Playgroud)

这是类的对象User

[6] pry(#<PermissionFormsController>)> current_user.class
=> User(id: integer, status: string, ...)
Run Code Online (Sandbox Code Playgroud)

有办法实现这一点吗?

dgi*_*rez 5

您不能将 Ruby 对象直接从表单传递到服务器,只能传递字符串。您的控制器负责将这些数据转化为实际模型。这通常是通过传递对象idYourModel.find在控制器中调用来完成的。

所以你需要像这样改变你的形式:

<%= f.select :user_id, User.all.map{|u| [u.to_s, u.id]} %>
Run Code Online (Sandbox Code Playgroud)

然后在控制器的操作中:

user = User.find(params[:permission_form][:user_id])
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。