简体   繁体   English

Rails:访问具有嵌套 model 的表单的参数

[英]Rails: Access params of a form with a nested model

I have the following models我有以下型号

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

I have a form for a new user, with a nested model gym_user.我有一个新用户的表单,其中包含嵌套的 model gym_user。 I want to make sure the user doesn't exist already.我想确保用户不存在。 This is what I'm trying:这就是我正在尝试的:

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

I know there's only one nested model here, but I can't figure out how to access those nested parameters.我知道这里只有一个嵌套的 model,但我不知道如何访问这些嵌套参数。

Here's the form itself这是表格本身

<%= 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 %>

I found the answer.我找到了答案。 I'm not sure if this is the best way but it works我不确定这是否是最好的方法,但它有效

params[:user][:gym_users_attributes].values.first

Your association should be你的协会应该是

has_one:gym, :through => gym_users has_one:gym, :through => gym_users

Also, can you post your form paramaters?另外,您可以发布您的表单参数吗?

Your focus is on not allowing creation of duplicate users, and you are using email to verify this.您的重点是不允许创建重复用户,并且您正在使用 email 来验证这一点。 You should rather use the helper你应该使用助手

validates_uniqueness_of:email

in your User model.在您的用户 model 中。 As you have a nested attribute, your object will be created only after Rails validates that a user with same email doesn't exist already.由于您有一个嵌套属性,因此只有在 Rails 验证具有相同 email 的用户不存在之后,才会创建您的 object。

I hope I understood your problem right.我希望我能正确理解你的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM