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

时间:2014-02-13 00:44:15

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

我有一个创建帖子的表单。帖子有一个名为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

1 个答案:

答案 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完成。