2013-12-14 28 views
0

這裏有很多,特別是對於Rails 4.0和Rails 3.x.我是嵌套路由的新手,我發現它非常困難,特別是對於表單。表單中的第一個參數不能包含零或在導軌中爲空4.0

所以,我有以下幾點:

路線

resources :users do 
    resources :api_keys, path: '/developmentcenter' 
    end 

這裏的關係是:用戶具有這樣的API密鑰屬於用戶許多API密鑰。

控制器

class ApiKeysController < ApplicationController 
    before_action :authenticate_user! 

    def new 
    @user = User.find(params[:user_id]) 
    @api_key = ApiKey.new(:user => @user) 
    end 

    def index 
    @user = User.find(params[:user_id]) 
    @api_key = @user.api_keys 
    end 

    def create 
    @user = User.find(params[:user_id]) 
    @api_key = ApiKey.new(create_new_api_key) 
    create_api_key(@api_key, @user) 
    end 

    def destroy 
    @user = User.find(params[:user_id]) 
    destroy_api_key(@user) 
    end 

    private 

    def create_new_api_key 
    params.permit(:api_key, user_attributes: [:id]) 
    end 
end 

上面是非常基本的。 create_api_key是一種在保存時執行某些操作的方法,或者在保存失敗時執行其他操作。雖然destroy_api_key只需找到基於用戶id的api密鑰並刪除它,在成功和失敗時做一些事情。

所以現在讓我們創建一個表單 - 它有一個用於創建API密鑰的按鈕。

<h2>Create a new Key</h2> 
<%= form_for ([@user, @api_keys]) do |f| %> 
    <p class="button"><%= f.submit "Generate API Key" %></p> 
<% end %> 

所有我們需要的是一個提交按鈕,用戶點擊後,會爲在其中將記錄用戶一個新的API密鑰

別急,我們有一個錯誤:

First argument in form cannot contain nil or be empty 

這個錯誤在發生:

<%= form_for ([@user, @api_keys]) do |f| %> 

所以 - 我已經看過的堆棧問題每一個(最好)處理這個錯誤,我已經改變了我的控制器基於幾個,你看到上面的。我甚至在rails手冊中查看了表單助手文檔。

我無法弄清楚這一點。

回答

1

它告訴你@user在它正在使用的上下文中是空的或零。這是一個尚未在數據庫中創建的用戶,或者您的User.find調用無法返回實際用戶。在它可以爲它創建嵌套資源(@api_key)之前,表單需要知道誰是@user。你的`create_api_key'是完全錯誤的。您需要首先將參數白名單,然後在數據庫中找到用戶(或創建它們),然後可以使用@user實例變量爲該用戶創建一個表單以創建一個鍵。我認爲如果你做得對,如果你在模型中定義了關係(has_many或者has_one,belongs_to等),你就不需要在表單的開頭調用@api_keys。你可以在訪問該頁面時發佈Web服務器控制檯輸出嗎?首先你打電話

@user = User.find(params[:user_id]) 

每次在你的控制器。你應該用before_action幹起來。

private 
def set_user 
    @user = User.find(api_key_params[:user_id]) 
end 

然後在控制器的頂部,你將有:

class ApiKeysController < ApplicationController 
    before_action :authenticate_user! 
    before_action: :set_user 

而且你應該讓你的。允許返回一個api_key_params變量稱爲方法:

def api_key_params 
    params.require(:user).permit(:api_key) 
end 

你必須要在一個白名單返回的東西的方式。要訪問這些參數,您只需調用該方法。你可以指定一個你想從方法中返回的參數,例如我的set_user例子。但它也使你能夠做這樣的事情:

def create 
    @api_key = Api_key.new(api_key_params) 
end 

這樣Api_key.new獲取用戶並創建密鑰。您不會顯示您自己如何或在哪裏生成密鑰。如果它是通過某種方法創建的,則應該將其放在Api_key的模型中。還有一些關於您的代碼的其他內容會讓您感到困惑,而不會看到其他文件。

相關問題