2010-04-19 8 views
2

J'ai un contrôleur d'entrées qui permet aux utilisateurs d'ajouter des informations de contact sur le site Web. Les informations soumises par l'utilisateur ne sont pas visibles pour les utilisateurs jusqu'à ce que l'administrateur coche une case à cocher et soumette le formulaire. Donc, mon problème est que si je coche la case en tant qu'administrateur lors de la création initiale d'une entrée (entrées # new), l'entrée sera visible publiquement comme prévu, mais si un utilisateur non-admin crée une entrée n'incluez pas la case à cocher 'live', seul l'administrateur le fait) alors cette entrée est bloquée dans les limbes car les entrées # edit view pour une raison quelconque ne met pas à jour la valeur booléenne case à cocher en tant qu'administrateur.Ruby on Rails case à cocher ne pas mettre à jour sur la soumission de formulaire

entrées # Vue:

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

entrées # modifier (accessible uniquement par admin) Vue:

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

EDIT:

méthode de mise à jour 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 

Des idées expliquant pourquoi un administrateur ne peut pas mettre à jour la case à cocher: live depuis la vue d'édition?

J'apprécierais grandement vos suggestions. Je suis nouveau sur les rails. Je peux poster plus de code si c'est nécessaire. Merci d'avoir lu ma question.

+2

veuillez poster votre méthode de mise à jour entries_controller.rb & entry.rb. – Salil

+0

merci d'avoir jeté un oeil. – BasicObject

Répondre

2

Vous êtes un ayant attr_accessible appel

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

Ce qui est génial car il va éviter que les utilisateurs de mettre à jour d'autres domaines que ceux que vous leur permettent.
Mais votre champ live n'est pas là. Donc, sa valeur est filtrée par des rails car l'utilisateur ne permet pas de mettre à jour ce champ. Ajoutez-le aux champs de l'appel attr_accessible et vous pourrez le modifier.

+0

Merci beaucoup! J'ai complètement manqué ça. – BasicObject

+0

Je recommanderais de ne pas l'ajouter, cet attribut ne devrait pas être accessible, car alors les utilisateurs pourraient le définir eux-mêmes. Cela irait à l'encontre du but de attr_accessible. A la place, faites '@entry.live = params [: entry] [: live] 'avant l'appel de update_attributes. – mckeed

Questions connexes