[英]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
<%= 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.