Ruby 在 rails 上。从另一个控制器内部创建 'model'

Ruby on rails. Create 'model' from inside another controller

我有一个 'job site',用户可以在其中创建工作,其他用户可以申请这些工作。用户需要 'tokens' 才能创建工作,当他们还剩 none 时,将被重定向到购买代币页面。令牌系统运行良好。 我已经设置了一个也可以工作的 braintree 表单,但不会为用户创建任何令牌。我想在交易完成后为用户创建一个新令牌。

到目前为止我有

routes.rb

resources :users do
resources :tokens
resources :transactions

Token.rb

class Token < ActiveRecord::Base
 belongs_to :user
end

Transactions.rb

 class Transaction < ActiveRecord::Base
  belongs_to :user
end

新token/payment形式

    <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 clienttokens 在令牌控制器中生成,因为表单位于新令牌页面上。这行得通。

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

不胜感激,谢谢。

固定:

before_action :find user

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

不需要。

删除它们并添加

Token.create(user_id: current_user.id)

已修复。谢谢。

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

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

发现 on the API. This is a very complicated solution that has many things fundamentally wrong with them. I've never seen anything like params[:user_id => current_user.id] I'm guessing you are trying to do hash assignment inside of a lookup Ruby doc

使用 Rail 的 form_for 助手可能更容易

两条建议:

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

脚本编写愉快