2015-01-21 2 views
0

У меня возникла раздражающая проблема с моим методом form_for при создании форумов. Каждый раз, когда я пытаюсь представить форум для создания, я получаю эту ошибку от Rails. param is missing or the value is empty: forumRails form_for assistance: param отсутствует или значение пуст

Проблема заключается в моем методе forums_param:

def forum_params 
    params.require(:forum).permit(:id, :name, :position) 
end 

Форум часть не существует. Приведенный ниже код является моя форма для представления:

well.span11 
    .span7 
    = form_for @forum, url: forums_path, html: { method: :post } do |f| 
     = render partial: "form", locals: { f: f } 
     .actions 
     = submit_tag 'Create', { class: 'btn btn-primary btn-small' } 
.clear 

И парциальное, что она делает:

%fieldset 
    %div{class: 'control-group'} 
    = label_tag :title, "Title (required)", class: 'control-label required' 
    %div{class: 'controls'} 
     = text_field_tag :name, nil, class: 'span8' 
    - if @forum.errors[:name] 
     %p{class: 'error'}#{@forum.errors[:name]} 

    %div{class: 'control-group'} 
    = label_tag :position, "Position", class: 'control-label' 
    %div{class: 'controls'} 
     = text_field_tag :position, nil, size: 5 

    %div{class: 'control-group'} 
    = label_tag :description, "Description", class: 'control-label' 
    %div{class: 'controls'} 
     = text_area_tag :description, nil, rows: 10, class: 'span10' 

Ниже приведен код контроллера:

def new 
    @forum = Forum.new 
    end 

    def create 
    @forum = Forum.new(forum_params) 
    if @forum.save 
     redirect_to forums_path, flash: { success: t('.success') } 
    else 
     redirect_to forums_path, flash: { error: t('.error') } 
    end 
    end 

Я не уверен, что здесь происходит. Я уже реализовал рекомендации, описанные в этих статьях.

Solution 1

Solution 2

Solution 3

Что здесь проблема? Помощь будет принята с благодарностью.

+0

Каков URL-адрес страницы, на которой вы получаете эту ошибку? – miler350

ответ

0

Из того, что я вижу, вам не хватает кучу вещей, поскольку оно идет от представления к контроллеру. У вас есть поле описания, название и т. Д., И они не учитываются в forum_params

Если пользователь может добавить их и изменить, они должны быть включены в сильные параметры. Я не думаю, что идентификатор должен быть там, хотя ... пользователю не должно быть позволено изменять идентификатор. Это должно быть создано AR при создании записи.

0

Проблема здесь заключается в использовании вами <foo>_tag вместо f.<foo>_field.

Когда вы используете <foo>_tag, в DOM появляется литеральный тег с атрибутами, которые вы ему дали.

text_field_tag пример:

text_field_tag 'title' 
# => <input id="title" name="title" type="text" /> 

Основываясь на примере из документации. Источник: the Ruby on Rails API docs for text_field_tag

Принимая во внимание, что при использовании f.<foo>_field атрибут name именуется под именем модели.

f.text_field пример:

text_field(:post, :title, size: 20) 
# => <input type="text" id="post_title" name="post[title]" size="20" value="#{@post.title}" /> 

Источник: the Ruby on Rails API docs for text_field

Чуть более глубокое объяснение

С учетом указанных выше примеров, когда первая была отправлена, PARAMS выглядеть :

{ ..., "title" => "user's input", ... } 

Вы можете видеть из этого, что если ваш контроллер пытается получить :post из этого параметра hash, это nil, и он выдает ошибку, с которой вы столкнулись.

В PARAMS для второго примера в первой секции выглядеть следующим образом:

{ ..., "post" => {"title" => "user's input", ... }, ... } 

Когда контроллер пытается получить :post из этого хэша, он получает суб-хэш, содержащий title (и любые другие поля формы).

Я надеюсь, что это решает вашу проблему!

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