виртуальные атрибуты - PullRequest
0 голосов
/ 21 июля 2011
<%= 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 ]

1 голос
/ 21 июля 2011

Если вы хотите, чтобы он обновлял только существующих пользователей, вам нужно будет найти пользователя по электронной почте в вашем действии создания, так как для членства нужны user_id и role_id.

1 голос
/ 21 июля 2011

Я думаю, что вы ищете, это вложенная форма. В модели с обозначением has_x вы можете использовать acceptpts_nested_attributes_for . Есть также Railscast , объясняющий это. Это означает, что у вас есть два достойных варианта:

  1. Переопределите вашу форму для пользователя и используйте fields_for для добавления атрибутов Членства
  2. Переключите ваши модели так, чтобы пользователь принадлежал к членству, а членство имеет_х пользователей (ей)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...