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]
答案 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中。当你看到这个时,它几乎总是不是你想要的。将过多参数传递给路径方法时会发生这种情况。