让个人资料拥有许多网站而不会使网站成为自己的资源

时间:2011-05-23 05:32:03

标签: ruby-on-rails ruby ruby-on-rails-3 attributes model

我想让个人资料包含许多网站(仅作为网址字符串),并让用户将网站填入不同的文本字段。但是,我希望这是配置文件资源的一个属性,而不是它自己的资源。如何进行设置以及如何在配置文件视图中访问网站字符串?

3 个答案:

答案 0 :(得分:2)

如果您不需要搜索这些网址字符串,请查看序列化

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

Serialize使您可以在一个字符串中存储多个URL。但是,如果您希望能够搜索这些网址,我建议您使用包含Websiteid字段的简单url表。

祝你好运!

答案 1 :(得分:0)

约定优于配置,所以你在这里反对。

对于db,将其存储为逗号分隔的字符串,例如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这样的网站......他们通常没有无限的网址。

答案 2 :(得分:0)

为模型添加新方法

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