【问题标题】:Rails: Access params of a form with a nested modelRails:使用嵌套模型访问表单的参数
【发布时间】:2011-08-09 19:51:33
【问题描述】:

我有以下型号

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 nested-forms nested-attributes


    【解决方案1】:

    我找到了答案。我不确定这是否是最好的方法,但它有效

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

    【讨论】:

      【解决方案2】:

      你的关联应该是

      has_one :gym, :through => gym_users

      另外,你能发布你的表单参数吗?

      【讨论】:

      • 我真正需要知道的是如何访问这些参数。
      • 它们应该打印在您的开发日志中。在你的控制器中也有 params.inspect
      【解决方案3】:

      您的重点是不允许创建重复用户,并且您正在使用电子邮件来验证这一点。你应该使用助手

      validates_uniqueness_of :email

      在您的用户模型中。由于您有一个嵌套属性,因此只有在 Rails 验证具有相同电子邮件的用户不存在之后才会创建您的对象。

      希望我能正确理解您的问题。

      【讨论】:

      • 好吧,与其告诉他们用户已经存在,我只想获取用户并根据发布的值创建一个新的 gym_user。
      • 我确实设置了这些验证,我这样做是为了让最终用户更轻松。
      • 哦,好的。我看到你也找到了答案。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多