Rails: Доступ к параметрам формы с вложенной моделью

У меня есть следующие модели

class GymUser < ActiveRecord::Base
  belongs_to :user 
  belongs_to :gym 
end

class User < ActiveRecord::Base
  has_many :gym_users
  has_one :gym

  attr_accessible :gym_users_attributes, :gym_users
  accepts_nested_attributes_for :gym_users
end

У меня есть форма для нового пользователя с вложенной моделью gym_user. Я хочу убедиться, что пользователь еще не существует. Вот что я пытаюсь:

def create_member
  @user = User.new(params[:user])
  @user.generate_password
  @dupe = User.find_all_by_email(@user.email)
  if(@dupe)
    @gym_user = GymUser.new(params[:user][:gym_users_attributes])
    @gym_user.user_id = @dupe.id
  elsif @user.save
    @gym_user = @user.gym_users.order('created_at DESC').first
    @gym = Gym.find(@gym_user.gym_id)
  end
end

Я знаю, что здесь только одна вложенная модель, но я не могу понять, как получить доступ к этим вложенным параметрам.

Вот сама форма

<%= form_for @user, :as => :user, :remote => true, :url => { :controller => 'users', :action => 'create_member'} do |f| %>
    <table border="0" cellpadding="10" cellspacing="0">
        <tr>
            <td colspan="2">
                <%= f.label :name %><br />
                <%= f.text_field :name %>
            </td>
            <td colspan="2">
                <%= f.label :email %><br />
                <%= f.text_field :email %>
            </td>
        </tr>
        <% f.fields_for :gym_users do |builder| %>
            <tr>
                <td>
                    <%= builder.label :role_id, "Role" %><br />
                    <%= builder.collection_select(:role_id, @roles, :id, :name, {:include_blank => true}, {:onchange => "new_member_role_changed()"}) %>
                    <%= builder.hidden_field :gym_id, :value => @gym.id %>
                </td>
                <td>
                    <%= builder.label :item_id, "Membership Level" %><br />
                    <%= builder.collection_select(:item_id, @gym.membership_items, :id, :name, {:include_blank => true}) %>
                </td>
                <td>
                    <%= builder.label :has_monthly_billing, "Recurring Billing?" %><br />
                    <%= builder.radio_button :has_monthly_billing, "1" %>Yes &nbsp;
                    <%= builder.radio_button :has_monthly_billing, "0" %>No
                </td>
                <td>
                    <%= builder.label :billing_date %><br />
                    <%= builder.collection_select(:billing_date, (1..31).to_a, :to_s, :to_s, {:include_blank => true}) %>
                </td>
            </tr>
            <tr>
                <td colspan="4">
                    <%= f.submit %>
                    <a href="javascript:close_new_member()">Cancel</a>
                </td>
            </tr>
        <% end %>
    </table>
<% end %>

person Jhorra    schedule 09.08.2011    source источник


Ответы (3)


Я нашел ответ. Я не уверен, что это лучший способ, но он работает

params[:user][:gym_users_attributes].values.first
person Jhorra    schedule 09.08.2011

Ваша ассоциация должна быть

has_one :gym, :through => gym_users

Кроме того, вы можете опубликовать параметры формы?

person Sameer C    schedule 09.08.2011
comment
Все, что мне действительно нужно знать, это как получить доступ к этим параметрам. - person Jhorra; 10.08.2011
comment
они должны быть распечатаны в вашем журнале разработки. также params.inspect в вашем контроллере - person Sameer C; 12.08.2011

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

validates_uniqueness_of :email

в вашей модели пользователя. Поскольку у вас есть вложенный атрибут, ваш объект будет создан только после того, как Rails подтвердит, что пользователя с таким же адресом электронной почты еще не существует.

Надеюсь, я правильно понял вашу проблему.

person rookieRailer    schedule 09.08.2011
comment
Что ж, вместо того, чтобы сообщать им, что пользователь уже существует, я хочу просто взять пользователя и создать нового gym_user на основе опубликованных значений. - person Jhorra; 10.08.2011
comment
У меня есть эти проверки, я делаю это, чтобы упростить конечным пользователям. - person Jhorra; 10.08.2011
comment
Ох, хорошо. И я увидел, что ты тоже нашел ответ. Удачи! - person rookieRailer; 10.08.2011