选择视图中的数据并将其插入用户数据库

时间:2018-05-27 10:28:56

标签: ruby-on-rails

我正在阅读来自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

有谁知道实际上是否可以创建这样的导入功能?因为我试图读取实际上不在本地数据库上的内容。

2 个答案:

答案 0 :(得分:0)

您已在

中调用@contacts
def 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。我导入了所有这些,但这是我现在能找到的最好的。