Недавно я добавил новое поле mapicon_id в свои записи места проведения, где отображаются все доступные значки в раскрывающемся списке «Новое» и «Изменить». Каждая запись также имеет верхнее и левое целочисленные поля, которые позволяют мне указать координаты для абсолютного позиционирования значков с помощью JavaScript.
До того, как я добавил новое поле mapicon_id, верхнее и левое поля работали нормально, но теперь левое поле не сохранится. Вы можете отредактировать поле или создать новую запись с левым значением и нажать кнопку «Сохранить», после чего оно выдаст успешное флэш-сообщение и правильно перенаправит, но поле будет пустым.
место проведения частичное:
<%= link_to venue do %>
<div class="venue_partial">
<div class="venue_icon">
<%= image_tag venue.venuetype.photo.url(:thumb), :class => 'image' %>
</div>
</div>
<% end %>
<%= link_to venue do %>
<div id="venue_map_icon_<%= venue.id %>" style="position:absolute;"><%= image_tag venue.mapicon.photo.url(:thumb), :class => 'venue_map_icon' %></div>
<% end %>
<script>
document.getElementById("venue_map_icon_<%= venue.id %>").style.left= "<%= venue.left %>px";
document.getElementById("venue_map_icon_<%= venue.id %>").style.top= "<%= venue.top %>px";
</script>
редактировать и новые:
<%= form_for @venue do |f| %>
<p>name: <br>
<%= f.text_field :name %></p>
<p>mapicon: <br>
<%= f.collection_select(:mapicon_id, Mapicon.all, :id, :name) %>
<p>top: <br>
<%= f.text_field :top %></p>
<p>left: <br>
<%= f.text_field :left %></p>
<%= submit_tag %>
<% end %>
журнал разработки при редактировании записи с верхним и левым значениями 100:
Started GET "/venues/45-test-place/edit" for 127.0.0.1 at 2011-02-26 11:07:10 +0000
Processing by VenuesController#edit as HTML
Parameters: {"id"=>"45-test-place"}
[1m[35mVenue Load (1.0ms)[0m SELECT `venues`.* FROM `venues` WHERE `venues`.`id` = 45 LIMIT 1
[1m[36mArea Load (0.0ms)[0m [1mSELECT `areas`.* FROM `areas`[0m
[1m[35mVenuetype Load (0.0ms)[0m SELECT `venuetypes`.* FROM `venuetypes`
[1m[36mMapicon Load (1.0ms)[0m [1mSELECT `mapicons`.* FROM `mapicons`[0m
Rendered venues/edit.html.erb within layouts/application (108.0ms)
Completed 200 OK in 150ms (Views: 127.0ms | ActiveRecord: 2.0ms)
Started POST "/venues/45-test-place" for 127.0.0.1 at 2011-02-26 11:07:16 +0000
Processing by VenuesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"By8blc3esfE6A8tnfOmRPn9f4KZb/ctwpjg86La4d1Y=", "venue"=>{"name"=>"test place", "addressline1"=>"", "addressline2"=>"", "addressline3"=>"", "phonenumber"=>"", "area_id"=>"8", "venuetype_id"=>"15", "mapicon_id"=>"1", "top"=>"100", "left"=>"100"}, "commit"=>"Save changes", "id"=>"45-test-place"}
[1m[35mVenue Load (1.0ms)[0m SELECT `venues`.* FROM `venues` WHERE `venues`.`id` = 45 LIMIT 1
[1m[36mSQL (0.0ms)[0m [1mBEGIN[0m
[1m[35mAREL (0.0ms)[0m UPDATE `venues` SET `top` = 100, `left` = 100, `updated_at` = '2011-02-26 11:07:16' WHERE `venues`.`id` = 45
[1m[36mSQL (30.0ms)[0m [1mCOMMIT[0m
Redirected to http://localhost:3000/venues.45-test-place
Completed 302 Found in 65ms
После редактирования этой записи в верхнем поле отображается 100, но в левом поле пусто.
модель объекта:
class Venue < ActiveRecord::Base
belongs_to :user
has_many :reviews
belongs_to :area
belongs_to :venuetype
belongs_to :mapicon
scope :with_type, lambda { |types|
types.present? ? where(:venuetype_id => types) : scoped }
scope :with_area, lambda { |areas|
areas.present? ? where(:area_id => areas) : scoped }
def to_param
"#{id}-#{name.gsub(/\W/, '-').downcase}"
end
def self.search(search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
модель Mapicon:
class Mapicon < ActiveRecord::Base
has_many :venues
has_attached_file :photo,
:styles => {
:thumb=> "100x100>",
:small => "150x150>",
:medium => "300x300>",
:large => "400x400>" },
:default_url => '/images/noimage.png'
end
UPDATE
Я удалил верхнее и левое поля и добавил toppx и leftpx, чтобы имена полей не были такими общими, однако проблема все еще существует, только теперь это поле toppx, которое не сохраняется. Кроме того, если я изменю javascript на значение venuetype_id вместо значения toppx, оно будет отображаться правильно. значение venuetype_id равно 15, а значок отображается в 15 пикселей сверху страницы.
новая миграция:
class AddToppxAndLeftpxToVenues < ActiveRecord::Migration
def self.up
add_column :venues, :toppx, :integer
add_column :venues, :leftpx, :integer
end
def self.down
remove_column :venues, :toppx
remove_column :venues, :leftpx
end
end
ДРУГОЕ ОБНОВЛЕНИЕ
irb(main):002:0> v=Venue.new
=> #<Venue id: nil, name: nil, addressline1: nil, addressline2: nil, addressline
3: nil, created_at: nil, updated_at: nil, area_id: nil, user_id: nil, venuetype_
id: nil, phonenumber: nil, toppx: nil, leftpx: nil>
irb(main):003:0> v.name='test23'
=> "test23"
irb(main):004:0> v.leftpx='24'
=> "24"
irb(main):005:0> v.toppx='42'
=> "42"
irb(main):006:0> v.venuetype_id='13'
=> "13"
irb(main):007:0> v.area_id='2'
=> "2"
irb(main):008:0> v.user_id='6'
=> "6"
irb(main):009:0> v.save
=> true
irb(main):010:0> Venue.find(:last)
=> #<Venue id: 55, name: "test23", addressline1: nil, addressline2: nil, address
line3: nil, created_at: "2011-02-28 18:07:42", updated_at: "2011-02-28 18:07:42"
, area_id: 2, user_id: 946706424, venuetype_id: 13, phonenumber: nil, toppx: nil
, leftpx: 24>
irb(main):011:0>
С другой стороны, я не знаю, что там происходит с изменением user_id, но он работает правильно и ассоциируется с правильным пользователем.
Спасибо за любую помощь!