繁体   English   中英

Ruby在轨道上。 从另一个控制器内部创建“模型”

[英]Ruby on rails. Create 'model' from inside another controller

我有一个“工作网站”,用户可以在其中创建工作,其他用户可以申请。 用户需要“令牌”来创建作业,当他们没有剩余的令牌时,将被重定向到“购买令牌”页面。 令牌系统工作正常。 我已经建立了一个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

新的代币/付款表格

    <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变量。 请求参数是在表单或查询字符串中发送的参数。 使用后操作调用create方法,这意味着参数应包括调用了提交操作的表单中的所有属性。 在您的表单视图中,我看到了两个嵌套的表单。

使用嵌套资源,如上面的路由文件所示,Rails上的嵌套资源演示了user_id是由事务提交路径设置的。 这意味着您用于表单操作的url帮助器必须是user_transactions_url(@user) 本质上,表单需要定向到/ users / [:user_id] / transactions

使用API上的 Rail的form_for帮助程序可能会更容易。 这是一个非常复杂的解决方案,从根本上说很多事情都是错的。 我从未见过像params[:user_id => current_user.id]这样的东西,我猜您正在尝试在查找Ruby文档中进行哈希分配。

两个建议:

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

快乐的脚本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM