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 约定
脚本编写愉快
我有一个 '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。
两条建议:
- 从简单的事情开始
- 符合 Rails 约定
脚本编写愉快