2010-04-19 3 views
2

У меня есть контроллер записей, который позволяет пользователям добавлять контактную информацию на веб-сайт. Представленная пользователем информация не отображается пользователям до тех пор, пока администратор не проверит флажок и не отправит форму. Таким образом, в основном моя проблема заключается в том, что если я поставлю флажок в качестве администратора, а сначала создаю запись (записи # новый), запись будет общедоступной, как ожидалось, но если пользователь, не являющийся администратором, создает запись (обычный пользовательский вид doesn 't включить' живой 'флажок, только администратор делает), то эта запись застряла в limbo, потому что записи # редактировать вид по какой-то причине не обновляют значение логического флажка при входе в систему как администратор.Рубин на 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 %> 

EDIT:

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 из окна редактирования?

Буду признателен за любые предложения. Я новичок в рельсах. Я могу отправить больше кода, если это необходимо. Спасибо, что прочитал мой вопрос.

+2

, пожалуйста, напишите свой способ ввода_controller.rb и элемент entry.rb. – Salil

+0

спасибо, что посмотрели. – BasicObject

ответ

2

Вы имеющие attr_accessible вызов

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

, который является большим, как это будет избежать пользователей для обновления других полей, чем те, которые вы позволяете им.
Но ваше поле live не существует.

Таким образом, это значение фильтруется рельсами, так как пользователю не разрешено обновлять это поле. Добавьте его в поля в вызове attr_accessible, и вы сможете его отредактировать.

+0

Большое вам спасибо! Я полностью пропустил это. – BasicObject

+0

Я бы рекомендовал не добавлять его, этот атрибут не должен быть доступен, потому что тогда пользователи могли бы установить его сами. Это победит всю цель attr_accessible. Вместо этого сделайте '@entry.live = params [: entry] [: live] 'перед вызовом update_attributes. – mckeed

Смежные вопросы