【问题标题】:Ruby on rails. Create 'model' from inside another controller红宝石在铁轨上。从另一个控制器内部创建“模型”
【发布时间】:2015-12-19 02:32:29
【问题描述】:

我有一个“工作网站”,用户可以在其中创建工作,其他用户可以申请这些工作。用户需要“代币”来创建工作,当他们没有剩余时被重定向到购买代币页面。令牌系统工作正常。 我已经设置了一个也可以使用的 Braintree 表单,但不会为用户创建任何令牌。我想在交易完成时为用户创建一个新令牌。

目前为止

routes.rb

resources :users do
resources :tokens
resources :transactions

令牌.rb

class Token < ActiveRecord::Base
 belongs_to :user
end

交易.rb

 class Transaction < ActiveRecord::Base
  belongs_to :user
end

新的代币/支付方式

    <form id="checkout" method="post" action="/transactions">
  <div id="payment-form"></div>
  <h2 class="mbs">Transaction</h2>
  <p> Payment formfor one gig </p>
  <%= form_tag transactions_path do%>
    <p>Please enter your payment details:</p>
    <div id="dropin"></div>
    <%=submit_tag "Pay €1.99", class: "button mt1" %>
  <%end%>
</form>

transactions_controller

 class TransactionsController < ApplicationController
before_action :find_user

  def new
  end


def create
    @result = Braintree::Transaction.sale(
              amount: 10,
              payment_method_nonce: params[:payment_method_nonce])
    if @result.success?
      @user = Token.build(params[:user_id => current_user.id])
      redirect_to new_gig_path, notice: "Congraulations! Your transaction has been successfully!"
    else
      flash[:alert] = "Something went wrong while processing your transaction. Please try again!"
      render :new
    end
  end

private
def generate_client_token
  Braintree::ClientToken.generate
end

def token_params
  params.require(:token).permit(:user_id)
end
def find_user
  @user = User.find(params[:user_id])
end
end

但我收到错误消息“找不到具有 'id'=' 的用户

braintree 客户端令牌在令牌控制器中生成,因为表单位于新令牌页面上。这行得通。

这是我最后一次尝试这样做,但我尝试了多种为 current_user 创建令牌的方法,但我无法让它工作。 令牌模型属性为 token_id 和 user_id。

我们将不胜感激,谢谢。

【问题讨论】:

  • 错误的堆栈跟踪是什么? exact 错误信息是什么?
  • 对不起,我不知道堆栈跟踪错误是什么或如何检索它。我只用了几周的轨道。我得到的错误是:ActiveRecord::RecordNotFound in TransactionsController#create: Couldn't find User with 'id'= : and '@user = User.find(params[:user_id])' 被突出显示。
  • 那么您似乎没有在参数中传递user_id。修复它。也使用Token.create 而不是Token.build
  • Token.create(user_id: @user.id)Token.create(user_id: current_user.id)(取决于哪个用户实际上应该在那里)

标签: ruby-on-rails post controller braintree


【解决方案1】:

固定:

before_action :find user

def find_user
  @user = User.find(params[:user_id])
end

不需要。

删除它们并添加

Token.create(user_id: current_user.id)

已修复。谢谢。

【讨论】:

    【解决方案2】:

    您的 before_action 使用从请求发送的参数设置@user。 before_action :find_user 表示不管 TransactionController 中的操作如何,在运行任何代码之前,先运行 find_user 中的代码。在 find_user 中,@user 变量是使用请求参数设置的。请求参数是在表单或查询字符串中发送的参数。使用 post 操作调用 create 方法,这意味着参数应包括调用提交操作的表单中的所有属性。在您的表单视图中,我看到了两个嵌套表单。

    对于嵌套资源,就像上面反映的路由文件一样,Rails Guides 上的Nested Resources 演示了 user_id 是由事务提交的路径设置的。这意味着表单操作的 url 助手需要是user_transactions_url(@user)。本质上,表单需要指向 /users/[:user_id]/transactions

    使用 on the API 找到的 Rail 的 form_for 助手可能更容易。这是一个非常复杂的解决方案,其中有很多根本性的问题。我从未见过像params[:user_id =&gt; current_user.id] 这样的东西,我猜您正试图在查找Ruby doc 中进行哈希分配。

    两条建议:

    • 从简单的事情开始
    • 符合 Rails 约定

    快乐的脚本

    【讨论】:

    • 您好,感谢您的评论。我意识到我已经嵌套了不必要的事务,并且已经将其删除。我整个下午都在研究各种方法来实现我想要的,显然犯了一些错误。 “params [:user_id => current_user.id]”是我通过搜索找到的,是我发布问题时的“最后手段”。我显然是 Rails 的新手,我很想知道“许多根本错误的事情”是什么,因此我可以识别和纠正这些错误。我目前正在清理代码,但它似乎确实有效
    • 很高兴您选择避开嵌套路由。我建议您将您的 user_id 放入会话中,这样您就不需要在每个请求中都传递它。试试form_for 块,它可以更轻松地制作表单。
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多