我正在阅读来自Outlook API
的用户的联系信息,我想使用submit_tag
方法将它们添加到我的用户数据库中。但它不起作用。到目前为止,index.html.erb
上的表单看起来像是:
<h1>My contacts</h1>
<table class="table">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
</tr>
<%= form_tag import_contacts_path, method: :put do %>
<%= submit_tag "Import Selected contact" %>
<% @contacts.each do |contact| %>
<tr>
<td> <%= check_box_tag "contact_ids[]", 'Select' %></td>
<td><%= contact.given_name %></td>
<td><%= contact.surname %></td>
<td><%= !contact.email_addresses[0].nil? ? contact.email_addresses[0].address : '' %></td>
</tr>
<% end %>
</table>
<%= submit_tag "Import Selected contactact" %>
<% end %>
我的ContactController看起来像:
class ContactsController < ApplicationController
include AuthHelper
def index
token = get_access_token
if token
# If a token is present in the session, get contacts
callback = Proc.new do |r|
r.headers['Authorization'] = "Bearer #{token}"
end
graph = MicrosoftGraph.new(base_url: 'https://graph.microsoft.com/v1.0',
cached_metadata_file: File.join(MicrosoftGraph::CACHED_METADATA_DIRECTORY, 'metadata_v1.0.xml'),
&callback)
@contacts = graph.me.contacts.order_by('givenName asc')
else
# If no token, redirect to the root url so user
# can sign in.
redirect_to root_url
end
end
def import
User.create(:first_name => @contacts.givenName , :last_name => @contacts.surname, :email => @contacts.email_addresses)
redirect_to imported_path
end
end
我可以毫无问题地阅读我的联系信息,但是当我尝试点击按钮导入选择的联系人时,我有以下错误:
NoMethodError (undefined method `givenName' for nil:NilClass):
app/controllers/contacts_controller.rb:26:in `import'
我的路线看起来像
resources 'contacts' do
collection do
put :import
end
有谁知道实际上是否可以创建这样的导入功能?因为我试图读取实际上不在本地数据库上的内容。
答案 0 :(得分:0)
您已在
中调用@contactsdef import
User.create(:first_name => @contacts.givenName , :last_name => @contacts.surname, :email => @contacts.email_addresses)
redirect_to imported_path
end
但是你还没有定义@contacts。因为@contacts是nil并且你将givenName调用为nil,所以它给出了错误。您可以在导入方法中或在过滤器之前指定@contacts,以便在该方法中可以使用它。 希望定义@contacts将解决问题。如果问题仍然存在,请告诉我。
请检查参数,在参数中,值必须来,你可以使用
之类的东西def import
User.create(:first_name => params[:givenName] , :last_name => params[:surname], :email => params[:email_addresses])
redirect_to imported_path
end
试试这个并告诉我是否有任何问题。或者你可以发送那些来自的参数。
答案 1 :(得分:0)
我最终在控制器中创建了以下功能:
def import_contact(contact)
Contact.create(email: !contact.email_addresses[0].nil? ? contact.email_addresses[0].address : '', first_name: contact.given_name, last_name: contact.surname, user_id: current_user )
return !contact.email_addresses[0].nil? ? contact.email_addresses[0].address : ''
end
并且视图调用函数:<%= import_contact(contact) %>
这样我很遗憾不会选择我要导入哪个conctact。我导入了所有这些,但这是我现在能找到的最好的。