Rails 4 - 在表单中访问嵌套模型的属性

时间:2014-05-14 09:55:01

标签: ruby-on-rails ruby-on-rails-4 nested-attributes

我的 帐户 模型与 用户 模型有has_many关系:

class Account < ActiveRecord::Base
  has_many :users, -> { uniq }
  accepts_nested_attributes_for :users


class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :confirmable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  belongs_to :account

我使用回形针将 头像 属性添加到 用户 模型。

我希望每个用户都可以访问常用帐户设置,并且可以在其内部上传他/她自己的头像。

我使用simple_form,所以我尝试了这个:

<%= simple_form_for current_account, :html => { :multipart => true } do |f| %>

    <%# here come account settings %>
    <%= f.input :time_zone, :label => t(".timezone"), 
                 :
                 :

    <%# here I need to access current user attributes %>
    <%= f.simple_fields_for :user, current_account.users.first do |user_form| %>
        <%= user_form.file_field :avatar, :error => false %>
    <% end %>

<% end %>

第一个问题:
我需要一些逻辑来访问current_user而不是current_account.users.first。由于有一个superadmin可以访问所有帐户,因此使用current_user是不够的。

第二个(也就是更大)问题:
我在控制器中添加了头像参数到白名单:

def allowed_params
  params.require(:account).permit(:time_zone, :logo, :description, user: [:avatar])
end

当我尝试更新我的模型时:

if current_account.update(allowed_params)

我收到此错误:

unknown attribute: user

我也尝试过:

params.require(:account).permit(:language, :time_zone, :logo, :description, :user_attributes => [:avatar])

params.require(:account).permit(:language, :time_zone, :logo, :description, :users_attributes => [:avatar])

(复数形式)

但是因为我使用ActionController::Parameters.action_on_unpermitted_parameters = :raise我得到了:

found unpermitted parameters: user

这一定很容易,有些帮助吗?

1 个答案:

答案 0 :(得分:1)

好的,明白了!

问题是一对多关系以及我尝试访问单个用户实例的方式。正确的方法是:

<% current_account.users.each_with_index do |user, index|%>
    <%= f.simple_fields_for :users, user do |user_form| %>
        <%= user_form.file_field :avatar, :error => false %>
    <% end %>
<% end %>

正如您所看到的,迭代应该在关系上完成,并且只有在有了 单一实例&#34;手中&#34;我们可以使用simple_fields_for

另请注意,传递给simple_fields_for的第一个参数是:users而不是:user,因为这是一对多的关系。