2016-01-01 45 views
0
Rails 4.2.1 
Ruby 2.1.5 

在我的routes.rb,我有:正確的路線到達控制器動作與傳遞的參數正常工作 - Rails的

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 

在我的意見/ 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

正如您從錯誤中看到的那樣,它不會將您引導至「activate_test_set」操作,而是指向「pause_test_set」操作。您可以通過在控制檯中執行'rake routes'來檢查正確的鏈接快捷方式。 – Kkulikovskis

+0

將這個'get'/ activate_test_set'=>'test_sets#activate_test_set''改成'get'/ activate_test_set /:id'=>'test_sets#activate_test_set''並且試試我希望它能工作 –

+0

我複製了錯誤的部分日誌文件。我有兩個激活和玩的動作。請參閱編輯 – Joseph

回答

0

嘗試什麼建議的意見:

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

另一種方式是正常使用PARAMS在這種情況下,你需要:

變化的鏈接標籤: <%= 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,看看有什麼方法鏈接看起來像那個動作。

+0

無法正常工作。我的IDE(RubyMine)也不喜歡這個代碼。當我刪除控制器操作的參數,並添加了test_set = TestSet.find(params [:id])時,它現在拒絕該行:test_set.update_attribute(status:'active')。它認爲它需要兩個論點,我只通過一個。 – Joseph

+0

@Joseph'update_attribute(name,value)' - 來自[docs](http://apidock.com/rails/ActiveRecord/Persistence/update_attribute)。所以把它改成'update_attribute('status','active')' – Kkulikovskis

+0

@Joseph你看過耙路嗎?因爲你的解決方案看起來並不理想。如果你想要一個自定義的方法(比如'active_test_set_path'),那麼用戶':as',但你可以省略'via::get',而不是'get「activate_test_set /:id」,:to =>「test_sets#activate_test_set 「,:as =>:activate_test_set' – Kkulikovskis

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中。當你看到這個時,它幾乎總是不是你想要的。當您將一個太多的參數傳遞給路徑方法時,會發生這種情況。

+0

我已經試過了。請參閱編輯我的問題 – Joseph

+0

應該有一個逗號'test_set.update_attribute(:status,'active')' – Swards

+0

是的,我修正了這個問題。現在,它告訴我它找不到我的路線:activate_test_set_path – Joseph

相關問題