Ruby on Rails 复选框未在提交表单时更新

Posted

技术标签:

【中文标题】Ruby on Rails 复选框未在提交表单时更新【英文标题】:Ruby on Rails check box not updating on form submission 【发布时间】:2010-04-19 04:12:04 【问题描述】:

我有一个条目控制器,允许用户在网站上添加联系信息。在管理员选中复选框并提交表单之前,用户提交的信息对用户不可见。所以基本上我的问题是,如果我在最初创建条目 (entries#new) 时以管理员身份选中该复选框,则该条目将按预期公开可见,但如果非管理员用户创建条目(普通用户视图不会'不包括'实时'复选框,只有管理员才这样做)然后该条目被卡在了边缘,因为条目#edit视图由于某种原因在以管理员身份登录时不会更新布尔复选框值。

条目#新视图:

<% form_for(@entry) do |f| %>
  <%= f.error_messages %>
  Name<br />
  <%= f.text_field :name %>

  Mailing Address<br />
  <%= f.text_field :address %>

  #...
  <%- if current_user -%>
    <%= f.label :live %><br />
    <%= f.check_box :live %>
  <%- end -%>
  <%= f.submit 'Create' %>
<% end %>

entries#edit(只能由管理员访问)视图:

<% form_for(@entry) do |f| %>
  <%= f.error_messages %>

  <%= f.label :name %><br />
  <%= f.text_field :name %>

  Mailing Address<br />
  <%= f.text_field :address %>

  <%= f.label :live %><br />
  <%= f.check_box :live %>

  <%= f.submit 'Update' %>

<% end %>

编辑:

entries_controller.rb 更新方法:

def update
  @entry = Entry.find(params[:id])
  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      flash[:notice] = 'Entry was updated.'
      format.html  redirect_to(@entry) 
    else
      format.html  render :action => "edit" 
    end
  end
end

entry.rb:

class Entry < ActiveRecord::Base
  acts_as_mappable
  acts_as_taggable_on   :tags
  validates_presence_of :name, :tag_list
  validates_length_of   :name, :maximum => 64
  validates_length_of   :tag_list, :maximum => 128, :allow_blank => false
  validates_length_of   :paddress, :maximum => 128, :allow_blank => true
  validates_length_of   :address, :maximum => 128, :allow_blank => true
  validates_length_of   :tollfreephone, :in => 7..32, :allow_blank => true
  validates_length_of   :phone, :in => 7..32, :allow_blank => true
  validates_length_of   :phone2, :in => 7..32, :allow_blank => true
  validates_length_of   :mobile, :in => 7..32, :allow_blank => true
  validates_length_of   :fax, :in => 7..32, :allow_blank => true
  validates_length_of   :email, :in => 7..48, :allow_blank => true
  validates_format_of   :email,
                    :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]2,)\Z/i,
                    :on => :create, :allow_blank => true

  validates_length_of   :website, :maximum => 64, :allow_blank => true
  validates_length_of   :description, :maximum => 1024, :allow_blank => true
  attr_accessible       :name, :tag_list, :paddress, :address, :tollfreephone,
                        :phone, :phone2, :mobile, :fax, :email, :website,
                        :description 
  validate              :required_info
  before_save           :geocode_paddress
  searchable_on         :name, :address, :phone, :phone2, :mobile, :fax, :email,
                    :website, :category, :description
private
  def required_info
    if( phone.empty?  and phone2.empty? and tollfreephone.empty? and 
        mobile.empty? and fax.empty?    and email.empty?         and 
        website.empty? 
      ) 
      errors.add_to_base "Please have at least one form of contact information."
    end
  end
  def geocode_paddress
    # if paddress is nil or empty set the old values to nil and return    
    ((self.lat = self.lng = nil); return true) if paddress.empty?
    g=Geokit::Geocoders::MultiGeocoder.geocode(paddress)
    (errors.add(:paddress,"Could not Geocode address");
       return false) unless g.success
    self.lat, self.lng = g.lat, g.lng
  end
end

关于为什么管理员不能从编辑视图更新 :live 复选框的任何想法?

如果有任何建议,我将不胜感激。我是新来的铁路。如果需要,我可以发布更多代码。感谢您阅读我的问题。

【问题讨论】:

请发布您的 entries_controller.rb 更新方法和 entry.rb 。 【参考方案1】:

您正在拨打attr_accessible 电话

attr_accessible       :name, :tag_list, :paddress, :address, :tollfreephone,
                    :phone, :phone2, :mobile, :fax, :email, :website,
                    :description 

这很好,因为它可以避免用户更新您允许他们更新的其他字段。 但是您的 live 字段不在其中。

所以它的值被 rails 过滤,因为用户不允许更新该字段。将其添加到 attr_accessible 调用中的字段中,您就可以对其进行编辑。

【讨论】:

非常感谢!我完全错过了。 我建议不要添加它,该属性不应该是可访问的,因为这样用户可以自己设置它。它会破坏 attr_accessible 的全部目的。相反,在调用 update_attributes 之前执行@entry.live = params[:entry][:live]

以上是关于Ruby on Rails 复选框未在提交表单时更新的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:以表单提交数组

Ruby on Rails:提交表单时“您想要的更改被拒绝”

不允许用户在 ruby​​ on rails 中提交带有空字段的表单

Ruby on Rails 4,在视图中形成

使用 js/jquery 在 ruby​​ on rails 中隐藏 form_tag 上的提交按钮

如何在 Ruby-on-Rails 中生成 PDF 表单