Флажок Ruby on Rails не обновляется при отправке формы - PullRequest
2 голосов
/ 19 апреля 2010

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

записей # редактировать (только для администратора) просмотр:

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

РЕДАКТИРОВАТЬ:

метод обновления records_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 из представления редактирования?

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

1 Ответ

2 голосов
/ 19 апреля 2010

У вас attr_accessible вызов

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

Это здорово, так как пользователи не будут обновлять другие поля, кроме тех, которые вы им разрешаете.
Но вашего поля live там нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...