2010-04-19 125 views
2

我有一个条目控制器,允许用户在网站上添加联系信息。在管理员选中复选框并提交表单之前,用户提交的信息对用户不可见。所以基本上我的问题是,如果我在初始创建条目(条目#新)时以管理员身份选中该复选框,条目将按预期公开显示,但如果非管理员用户创建条目(普通用户视图不会不包括'活'复选框,只有管理员),那么该条目陷入僵局,因为条目#编辑视图出于某种原因不以管理员身份登录时更新布尔值复选框值。Ruby on Rails复选框未在表单提交上更新

项#新观点:

<% 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 %> 

条目#编辑(仅管理员访问)的观点:

<% 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 

有关为什么管理员无法更新从编辑视图中的实时复选框的任何想法?

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

+2

请发布您的entries_controller.rb更新方法&entry.rb。 – Salil 2010-04-19 04:48:45

+0

感谢您的采访。 – BasicObject 2010-04-19 05:16:25

回答

2

您遇到的attr_accessible呼叫

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

这是伟大的,因为它会避免用户更新等领域比你让他们的人。
但您的live字段不在那里。

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

+0

非常感谢!我完全错过了。 – BasicObject 2010-04-19 06:35:40

+0

我建议不要添加它,该属性不应该可访问,因为然后用户可以自己设置它。它会挫败attr_accessible的全部目的。相反,在调用update_attributes之前执行'@entry.live = params [:entry] [:live]'。 – mckeed 2010-04-19 07:27:09

相关问题