Ruby on rails 让个人资料拥有多个网站,而不让网站成为自己的资源
我想让一个配置文件有许多网站(作为一个url字符串),并让用户将网站填写到不同的文本字段中。但是,我希望这是概要文件资源的一个属性,而不是它自己的资源。如何设置此设置以及如何访问配置文件视图中的网站字符串?如果不需要搜索这些URL字符串,请查看serialize 序列化使您能够在一个字符串中存储多个URL。但是,如果您希望能够搜索这些url,我建议您使用带有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
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