Ruby on rails 让个人资料拥有多个网站,而不让网站成为自己的资源

Ruby on rails 让个人资料拥有多个网站,而不让网站成为自己的资源,ruby-on-rails,ruby,ruby-on-rails-3,attributes,model,Ruby On Rails,Ruby,Ruby On Rails 3,Attributes,Model,我想让一个配置文件有许多网站(作为一个url字符串),并让用户将网站填写到不同的文本字段中。但是,我希望这是概要文件资源的一个属性,而不是它自己的资源。如何设置此设置以及如何访问配置文件视图中的网站字符串?如果不需要搜索这些URL字符串,请查看serialize 序列化使您能够在一个字符串中存储多个URL。但是,如果您希望能够搜索这些url,我建议您使用带有id和url字段的简单Website表 祝你好运 约定优先于配置,因此您在这里违反了规则 对于数据库,将其存储为逗号分隔的字符串,例如Us

我想让一个配置文件有许多网站(作为一个url字符串),并让用户将网站填写到不同的文本字段中。但是,我希望这是概要文件资源的一个属性,而不是它自己的资源。如何设置此设置以及如何访问配置文件视图中的网站字符串?

如果不需要搜索这些URL字符串,请查看serialize

序列化使您能够在一个字符串中存储多个URL。但是,如果您希望能够搜索这些url,我建议您使用带有
id
url
字段的简单
Website


祝你好运

约定优先于配置,因此您在这里违反了规则

对于数据库,将其存储为逗号分隔的字符串,例如
User.websites\u 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 
然后在视图中,您需要编写自己的方法,以具有不同的
文本\u字段

<%= @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这样的网站,推特。。。。它们通常没有无限的URL。

将新方法添加到模型中

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
类配置文件
将此块添加到控制器(例如“更新”操作)

def更新
@profile=profile.find(参数[:id])
网站=[]
参数[:profile]。每个_键都有| prm_名称|

web_sites还有,您如何调整它以允许用户添加他/她想要的任意多个网站?serialize是Rails的内置(通常是优雅的)方式,它可以实现您指定的功能,但不需要额外的代码,并且能够添加用户想要的任意多个网站。更好的是,这些网站可以添加到一个用逗号分隔的
text\u区域中,而不是每个网站都需要离散的
text\u字段。我只需要一个文本字段,但这不是问题的目的。
<%= 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