【问题标题】:How do you pass parameters to a controller method when you invoke it in the Rails console?在 Rails 控制台中调用控制器方法时,如何将参数传递给它?
【发布时间】:2019-10-01 20:25:18
【问题描述】:

我正在使用 Rails 5。我有这个控制器...

class MyObjectsController < ApplicationController

  def create
    my_object = MyService.build(create_params)

我想在 Rails 控制台中调用 create 方法,但出现此错误...

irb(main):007:0> MyObjectsController.new.create(:id => "abc")
Traceback (most recent call last):
        2: from (irb):7
        1: from app/controllers/my_objects_controller.rb:4:in `create'
ArgumentError (wrong number of arguments (given 1, expected 0))

如何将参数传递给我的控制器方法?

【问题讨论】:

    标签: ruby-on-rails controller console ruby-on-rails-5


    【解决方案1】:

    您收到此错误是因为 create 方法没有收到任何参数。为了正确使用创建操作,您需要将 ActionController::Parameters 传递给控制器​​的实例:

    c = MyObjectsController.new
    c.params = ActionController::Parameters.new(id: "abc")
    c.create # It will not work if this controller uses authentication
    

    【讨论】:

    • 这个“答案”在某些情况下会更好。这个new({id: "abc"}) 也可以是这个new(id: "abc")。少打字总是更好。
    • 控制器函数确实在运行,但是当它尝试渲染时,它会抛出DelegationError。有什么办法解决吗?
    【解决方案2】:

    你可以试试

    app.post "?create_params[id]=abc"

    例如

    app.post '/users?user[name]=test&user[age]=20'

    将通过以下 {"user"=>{"name"=>"test", "age"=>"20"}}

    【讨论】:

      【解决方案3】:

      如果要求是通过rails控制台调用请求方法为POST的控制器的action方法并在其中传递参数,则可以通过以下命令完成

      # Request any of the application resource, for example root url to get authenticity token
      app.get '/'
      token = app.session[:_csrf_token]
      
      # parameters to send
      parameters = { my_object: { field_one: 'foo', field_two: 'bar' }, authenticity_token: token }
      
      # Call controller method
      app.post '/my_objects', params: parameters
      

      【讨论】:

        【解决方案4】:

        Rails 中的params 无法在任何地方访问。 Rails 中的参数只能从继承自ActionController::Base 的类中访问,因此在Rails 控制台中您无法访问params,但您可以通过公共方法访问params

        【讨论】:

          【解决方案5】:

          您可以按如下方式定义控制器操作:

          def my_actions(myparams=nil)
            @loginid = myparams.nil? ? params[:login_id] : myparams[:login_id] 
          end
          

          通过这种方式,您可以通过传递参数在 Rails 控制台中测试您的控制器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-16
            • 1970-01-01
            • 2013-03-24
            • 1970-01-01
            • 1970-01-01
            • 2020-05-09
            • 2015-05-02
            • 2011-09-03
            相关资源
            最近更新 更多