虚拟属性

时间:2011-07-21 16:39:13

标签: ruby-on-rails

<%= form_for(@membership) do |f| %>
  <%= f.collection_select :user_id, User.all, :id, :email %>
  <%= f.collection_select :role_id, Role.all, :id, :name %>
  <%= f.submit %>
<% end %>

我想要做的不是为用户使用选择框,而是想为用户的电子邮件添加文本字段。

<%= form_for(@membership) do |f| %>
  <%= f.text_field :email %>
  <%= f.collection_select :role_id, Role.all, :id, :name %>
  <%= f.submit %>
<% end %>

Membership.rb

belongs_to :user
belong_to :role

attr_accessor :email
def email
 self.user.email if self.user
end

我不知道在控制器中编写什么才能使其工作,这个attr访问器使用的东西和电子邮件方法还可以吗?任何帮助表示赞赏。

  def create
     @membership = Membership.new(params[:membership])
     if @membership.save
        redirect_to(memberships_url)
      else
       render :action => "new"
  end

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是嵌套表格。在具有has_x标识的模型上,您可以使用accepts_nested_attributes_for。还有Railscast解释它。这意味着你有两个不错的选择:

  1. 重新定义您的表单以供用户使用,并使用fields_for添加成员资格属性
  2. 切换模型,以便用户属于成员资格,成员资格为has_x用户

答案 1 :(得分:1)

如果您只想更新现有用户,则必须在创建操作中通过电子邮件找到用户,因为成员资格需要user_id和role_id。