Предоставление профилю большого количества веб-сайтов без создания собственного ресурса. - PullRequest
2 голосов
/ 23 мая 2011

Я хочу, чтобы в профиле было много веб-сайтов (например, просто строка URL-адреса), и чтобы пользователь мог заполнять веб-сайты различными текстовыми полями. Однако я хочу, чтобы это был атрибут ресурса профиля, а не его собственный ресурс. Как это настроить и как получить доступ к строкам сайта в виде профиля?

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Если вам не нужно искать по этим строкам URL, посмотрите serialize .

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

Serialize позволяет хранить несколько URL-адресов только в одномстрока.Однако, если вы хотите иметь возможность поиска по этим URL-адресам, я рекомендую вам использовать простую таблицу Website с полями id и url.

Удачи!

0 голосов
/ 23 мая 2011

Добавить новый метод в модель

class Profile < ActiveRecord::Base
  def web_sites_hash
    result = {}
    arr = web_sites.squish.split(' ') << ""
    arr.each_index {|i| result["web_site_#{i}"] = arr[i]}
    result
  end
end

Изменить вид. Вместо этого:

<%= f.label :web_sites %><br />
<%= f.text_area :web_sites %>

попробуйте это:

<%= f.label :web_sites %><br />
<% @profile.web_sites_hash.each_pair do |virt_field_name, virt_field_value| %>
  <%= f.text_field virt_field_name, :value => virt_field_value %><br />
<% end %>

Добавить в контроллер этот блок (например, действие «обновить»)

def update
  @profile = Profile.find(params[:id])

  web_sites = []
  params[:profile].each_key do |prm_name|
    web_sites << params[:profile].delete(prm_name) if /^web_site_\d+$/ =~ prm_name      
  end
  params[:profile][:web_sites] = web_sites.join(' ').squish

  @profile.update_attributes(params[:profile])
  ...
end

В представлении вы можете добавить больше входных данных с помощью JavaScript. Вот образец: http://asciicasts.com/episodes/197-nested-model-form-part-2

0 голосов
/ 23 мая 2011

Соглашение по конфигурации, так что вы идете против зерна здесь.

Что касается базы данных, сохраните ее в виде строки с разделителями-запятыми, например User.websites_string.

class User
    attr_accessor :website_one
    attr_accessor :website_two
    attr_accessor :webstie_three

before_save :parse_websites   

def prase_websites
    w1 = self.website_one ||= ""
    w2 = self.website_two ||= ""
    w3 = self.website_three ||= ""  
    self.websites = "#{w1}, #{w2}, #{w3} "
end

def websites
      self.websites_string.split(/[\s,]+/)
   end
end 

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

<%= @form_for(user) do |f| %>
    <p><%= f.text_field :website_one %></p>
    <p><%= f.text_field :website_two %></p>
    <p><%= f.text_field :webstie_three %></p>
<% end %>

И если вы хотите иметь больше веб-сайтов, вам следует подумать о метапрограммировании. Действительно высушить вещи. Но такие сайты, как linkedin, SO, Twitter ... обычно не имеют неограниченных URL.

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