使用传递的参数使控制器操作正常工作的正确途径 - Rails

时间:2016-01-01 21:07:05

标签: ruby-on-rails

Rails 4.2.1
Ruby 2.1.5

在我的routes.rb中,我有:

get '/activate_test_set' =>  'test_sets#activate_test_set'

在test_sets_controller.rb中,我有:

def activate_test_set test_set
  test_set.update_attribute(status: 'active')
  render test_sets_url
end

在我的views / test_sets / index.html中,我有:

<%= link_to "#{t('activate')}", activate_test_set_path(test_set) %>

当我在视图中时,如果我点击链接,我会在开发错误日志中得到以下信息:

Started GET "/activate_test_set.1" for ::1 at 2016-01-01 13:23:55 -0800
Processing by TestSetsController#activate_test_set as 
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.0ms)

ArgumentError (wrong number of arguments (0 for 1)):
 app/controllers/test_sets_controller.rb:69:in `activate_test_set'

什么是正确的routes.rb声明才能使其正常工作?

我也在routes.rb中试过这个:

get '/activate_test_set/:id' =>  'test_sets#activate_test_set'

这就是我得到的:

Started GET "/activate_test_set.1" for ::1 at 2016-01-01 15:14:57 -0800
    SELECT `schema_migrations`.* FROM `schema_migrations`
ActionController::RoutingError (No route matches [GET] "/activate_test_set.1"): 

解决方案:

经过一些额外的实验,这就是我如何解决这个问题。作为一个新手,我不确定这是最好的解决方案,但在这里:

match "activate_test_set/:id", :to => "test_sets#activate_test_set", :as => :activate_test_set, via: [:get]

2 个答案:

答案 0 :(得分:0)

尝试评论中建议的内容:

get '/active_test_set'...更改为get '/active_test_set/:id'

其他方式是使用普通参数,在这种情况下你需要:

将链接标记更改为:  <%= link_to "#{t('activate')}", activate_test_set_path(id: test_set) %>

无论您选择哪种路线,您都不需要控制器操作中的参数。每当您的控制器操作与路由一起使用时,您不需要为该操作设置参数,而是在链接标记中设置参数(如修复2中所示)并通过控制器内的params哈希访问它们像这样的行动:

def activate_test_set
  test_set = TestSet.find(params[:id])
  test_set.update_attribute(status: 'active')
  render test_sets_url
end 

编辑: 使用rake routes查看该操作的链接方法。

答案 1 :(得分:0)

在路线中,您需要设置参数

get '/activate_test_set/:id' =>  'test_sets#activate_test_set'

然后,当你链接到它时,它会将test_set_id添加到params散列中,你就可以得到它

def activate_test_set
  test_set = TestSet.find(params[:id])
  test_set.update_attribute(:status, 'active')

  ...

end

另请注意,此错误

Started GET "/activate_test_set.1" for ::1 at 2016-01-01 13:23:55 -0800

.1是format(默认为html)。当您将test_set作为参数发送时,它将test_set的id作为格式放在url中。当你看到这个时,它几乎总是不是你想要的。将过多参数传递给路径方法时会发生这种情况。