Skip to main content
 首页 » 编程设计

ruby-on-rails中如果在 Rails 中选中复选框,则在表单提交上设置一个值

2024年11月24日64lyhabc

我有一个创建帖子的表单。帖子有一个名为 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 直接在模型中完成。