首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户子对象Rails 4上未定义的方法错误

用户子对象Rails 4上未定义的方法错误
EN

Stack Overflow用户
提问于 2014-10-02 14:38:12
回答 1查看 114关注 0票数 0

我有一个对象(事务),它是belongs_to用户和用户has_many事务。当我尝试在rails表单中创建这个对象时,我会得到以下错误:

代码语言:javascript
复制
undefined method `transaction_kind' for nil:NilClass
app/models/transaction.rb:10:in `create_transaction'
app/controllers/transactions_controller.rb:17:in `create'

提交表单后通过我的控制台传递的params散列如下所示:

代码语言:javascript
复制
Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXXXX", "transaction"=>{"transaction_kind"=>"Deposit", "user_id"=>"113", "credit"=>"99"}, "commit"=>"Submit Request", "lender_id"=>"113"}

Transaction.rb看起来是这样的:

代码语言:javascript
复制
class Transaction < ActiveRecord::Base
    belongs_to :user
    after_save :create_transaction
    attr_accessible :transaction_kind, :user_id, :credit, :debit, :created_at

    def create_transaction
    client = Restforce.new
    credit = '012c00000004k5A'
    debit = '012c00000004k55'
    if @transaction.transaction_kind == "Deposit"
        client.create!('Transaction__c', Account__c: self.salesforce_id, RecordTypeId: credit, Debit_Amount__c: self.debit, Credit_Amount__c: self.credit, Recorded_On__c: self.created_at, Status__c: 'New Transaction', Type: 'Deposit', Transaction_Type__c: self.transaction_kind)
    else
        client.create!('Transaction__c', Account__c: self.salesforce_id, RecordTypeId: debit, Debit_Amount__c: self.debit, Credit_Amount__c: self.credit, Recorded_On__c: self.created_at, Status__c: 'New Transaction', Type: 'Withdrawal', Transaction_Type__c: self.transaction_kind)
    end
  end 

end

new.html.erb有以下表单代码:

代码语言:javascript
复制
<%= form_for [@user, @transaction], url: lender_transaction_path(@user) do |f| %>
  <%= f.hidden_field :transaction_kind, :value => "Deposit" %>
  <%= f.hidden_field :user_id, :value => @user.id %>
  <%= f.label :credit, :class => "required" %>
  <%= f.text_field :credit, :autofocus => :true, :class => "form-control margin-bottom-20 required"%>
  <%= f.submit 'Submit Request', :class => "btn-u btn-u-primary" %>
<% end %>

transactions_controller.rb

代码语言:javascript
复制
class TransactionsController < ApplicationController
    before_filter :authenticate_user!

    def new
        @user = current_user
        @transaction = Transaction.new
        if @user.activated?
            client = Restforce.new
            @account = client.find('Account', @user.salesforce_id, 'Account_Id')
            transaction_query = "select from  where Account__c ='%s' AND " % @account.Id.to_s
            @transactions = client.query(transaction_query)
        end 
    end

    def create
        @user = current_user
        @transaction = Transaction.create(transaction_params)
        if @transaction.save
            redirect_to new_lender_transaction_path(@user)
        end
    end

    private

        def transaction_params
            params.require(:transaction).permit(:transaction_kind, :credit, :debit, :created_at)
        end

end

在这个问题上任何帮助都是很好的。或者任何关于如何进一步调试的想法。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-02 14:54:41

您不能将实例变量从一个控制器传递到另一个模型,因此Transaction模型不知道@transaction是什么,因此假设它是一个nil

我会将代码修改为:

代码语言:javascript
复制
if self.transaction_kind == "Deposit"

self会让它正常工作。如果不是,请尝试使用attr_accessor :transaction_kind或简单地将if transaction_kind == "Deposit"放在

此外,我认为最好将client.create!重构为:

代码语言:javascript
复制
Restforce.create!(...)

这将避免您编写另一个client = Restforce.new行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26163265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档