0

我有一个批量分配错误,我只能用 UGLY 代码修复。我一定做错了什么。让我解释:

我的 Rails 应用程序客户有很多联系人。客户页面显示属于该客户的联系人列表。我希望能够将新联系人添加到列表中。所以我使用...将客户端传递给联系人控制器

<%= link_to('new contact', new_contact_path(client_id: @client)) %> 

在联系人控制器中......

def new
 client=Client.find(params[:client_id])
 @contact=client.contacts.new
end


def create
  @client = Client.find(params[:contact][:client_id])
  @contact= @client.contacts.build(params[:contact])
      if @contact.save
 ...

“保存”会导致一个不足为奇的错误:

无法批量分配受保护的属性:client_id

因为联系人参数包括在联系人模型中不是(也不应该是) attr_accessible 的 client_id

我知道如何解决问题的唯一方法是单独设置每个参数(不包括 client_id),如下所示:

@contact= @client.contacts.build(first_name: params[:contact][:first_name], last_name:     params[:contact][:first_name], email: params[:contact][:email])

这种方法有效,但似乎一切都是错误的。当然是一些更优雅的选择。任何帮助表示赞赏。(是的,我是 Rails 新手)

4

1 回答 1

1

要跳过告诉您应该如何修复错误的部分,我想首先告诉您应该如何进行编码 :) 如果我错了,请纠正。

Routes.rb你应该放(如果不是这样的话):

resources :client do
    resources : contacts
end

然后,在你的view文件中,你应该放这样的东西:

<%= link_to('new contact', new_client_contact_path(@client)) %> 

这样,您不必在创建操作中做任何事情,rails 将管理所有其他事情。这就是它应该做的方式

编辑:

只是为了让它更清楚。在new你的contacts控制器中你应该把:

user= user.find(params[:user_id])
#2nd you build a new one
@contact= user.contacts.build

在控制器中的create操作中contacts,您应该输入:

user = User.find(params[:user_id])
#2nd you create the contact with arguments in params[:contact ]
@contact = user.contact.create(params[:contact ])
response .....
于 2013-04-08T11:48:17.593 回答