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

标签 ruby-on-rails ruby-on-rails-3 forms

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

关于ruby-on-rails - 如果在 Rails 中选中复选框,则在表单提交上设置一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743081/

相关文章:

ruby-on-rails - Rails3 和 Devise 作为基本 CRM 的一部分

ruby-on-rails - 如何使用 Rails 3 在 cookie 中存储哈希值

javascript - 如何将 HTML 表单的值放入 "custom"URL?

javascript - 选择标签默认选择空白项

ruby-on-rails - form_for 选择字段中的占位符?

ruby-on-rails - `puma:restart'调用两次,但我只能通过Capistrano在我的部署应用程序上调用一次?

ruby-on-rails - 我的 rails 助手将 '<' 渲染为 '&lt;' !如何使其正确渲染?

ruby-on-rails - 使用命名空间编辑 simple_form_for

ruby-on-rails - Ruby on Rails 用户日期输入

angular - 仅当输入可见时才激活 Angular 验证器