我有一个创建帖子的表单。帖子有一个名为 school_id 的非必填字段。在帖子表单(创建新帖子)上,我有一个复选框。如果选中该复选框,我想将 :school_id 设置为等于也设置为 current_user (由 Devise 创建的对象)的 school_id。如果选中该复选框,如何将 Post.school_id 设置为等于 current_user.school_id?
我在表单上的复选框传递的是 :school_id 1 并且永远不会改变。这是因为复选框只能接受 1 或 0 的 bool 值吗?这是到目前为止我在表格上的内容:
<%= simple_form_for @post do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.text_area :content, required: true %>
<% if @school %>
<%= f.label :school_id, "Set school",:class => "checkbox inline" %>
<%= f.check_box :school_id, :value => current_user.school.id %>
<% end %>
<%= f.submit "Submit Post", class: 'btn btn-primary' %>
<% end %>
编辑
后置 Controller
def create
@school = current_user.school
@post = current_user.posts.build(params[:post])
@post.school_id = current_user.school_id if @school && @post.use_school.present?
end
带有帖子表单的 Controller
def index
@post = current_user.posts.build
@school = current_user.school
@post.school_id = current_user.school_id if @school && @post.use_school.present?
respond_to do |format|
format.html # index.html.erb
format.json
format.js
end
end
请您参考如下方法:
您的问题来自Simpleform! Simpleform 强制复选框输入为 bool 值。使用其他语法也会遇到同样的问题:
<%= f.input :school_id, :as => :boolean, :input_html => { :value => current_user.school.id } %>
更深入:
<%= f.check_box :school_id, :value => current_user.school.id %>
将生成如下内容:
<input type="hidden" name="post[school_id]" value="0">
<input type="checkbox" name="post[school_id]" value="1">
注意:Simpleform 会自动添加第一行(这是一个很好的做法),以确保在未选中输入时在提交时发送值 (0)。否则,您可能会遇到模型更新问题。
您的字段不是 bool 值,您不应使用复选框。此外,用户可以编辑复选框的值(firebug & co),这可能会导致数据不一致或黑客攻击。因此,通过复选框,您应该检查 Controller 中的 school_id
是否正确。
我建议这个解决方法:
app/views/posts/new.rb:
<% if @school %>
<%= f.label :use_school, "Set school",:class => "checkbox inline" %>
<%= f.input :use_school, :as => :boolean %>
<% end %>
app/models/post.rb:
attr_accessor :use_school
应用程序/ Controller /posts_controller.rb:
@post = Post.new(params[:post])
@post.school_id = current_user.school_id if @school && @post.use_school.present?
注意: Controller 部分可以使用 :before_save
直接在模型中完成。