2013-12-14 7 views
0

Есть много таких, особенно для Rails 4.0 и Rails 3.x. Я новичок в вложенной маршрутизации, и мне это очень сложно, особенно с формами.Первый аргумент в форме не может содержать nil или быть пустым в рельсах. 4.0

Так у меня есть следующие:

Маршруты

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

Отношения здесь: пользователь имеет много ключей 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 Просто найдите ключ 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| %> 

Так что - я посмотрел на каждый из вопросов стека (а большинство), которые касаются этой ошибки, я изменил свой контроллер на основе нескольких, на то, что вы видите выше. Я даже смотрю на документы справки формы в руководстве по рельсам.

Я не могу понять это.

ответ

1

Сообщаем вам, что @user пуст или нуль в контексте, который он использует. Либо это пользователь, который еще не был создан в БД, либо ваш вызов User.find не работает, чтобы вернуть фактического пользователя. Форма должна знать, кто является @user, прежде чем он сможет создать вложенный ресурс (@api_key) для него. Ваша `create_api_key 'совершенно неверна. Сначала вам нужно сначала скопировать ваши параметры, затем найти пользователя в БД (или создать их), затем вы можете использовать переменную экземпляра @user, чтобы создать форму для этого пользователя для создания ключа. Я думаю, что если вы все сделаете правильно, вам не нужно будет вызывать @api_keys в начале формы, если вы определили отношения в своих моделях (has_many или has_one, belongs_to и т. Д.). Вы можете опубликовать вывод консоли веб-сервера при посещении этой страницы? Прежде всего вы звоните

@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. Есть и другие вещи о вашем коде, которые запутывают, не видя остальных ваших файлов.

 Смежные вопросы

  • Нет связанных вопросов^_^