我有一个创建帖子的表单。帖子有一个名为school_id的非必填字段。在Post表单上(创建一个新帖子)我有一个复选框。如果选中该复选框,我想将:school_id设置为等于也设置为current_user(由Devise创建的对象)的school_id。如果选中复选框,如何将Post.school_id设置为等于current_user.school_id?
我在表单上的复选框是传递:school_id为1并且永远不会更改。这是因为复选框只能接受1或0的布尔值吗?到目前为止,这是我在表单上的内容:
<%= 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 %>
修改
发布控制器
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
带有帖子表格的控制器
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
答案 0 :(得分:2)
你的问题来自Simpleform! Simpleform强制复选框输入为布尔值。您将遇到与其他语法相同的问题:
<%= 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)。否则,您可能会遇到模型更新问题。
您的字段不是布尔值,您不应使用复选框。此外,用户可以编辑复选框(firebug&amp; co)的值,这可能导致不一致的数据或黑客。因此,使用复选框,您应该检查控制器中的school_id
是否正确。
我建议这方面的工作:
应用程序/视图/帖/ new.rb:
<% if @school %>
<%= f.label :use_school, "Set school",:class => "checkbox inline" %>
<%= f.input :use_school, :as => :boolean %>
<% end %>
应用程序/模型/ post.rb:
attr_accessor :use_school
应用程序/控制器/ posts_controller.rb:
@post = Post.new(params[:post])
@post.school_id = current_user.school_id if @school && @post.use_school.present?
注意:控制器部件可以直接在您的模型中使用:before_save
完成。