2013-12-10 2 views
1

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

У меня есть простая новая форма, которая должна принимать два поля из form_for, а затем отправлять их в базу данных. Проблема в том, что это не так.

Мой образец дб имеет только два поля: имя и site_id

Вот мой new.html.erb:

<%= form_for @kejsu do |f| %> 
<%= f.text_field :name %> 
<%= f.text_field :site_id %> 
<%= f.submit "Create" %> 
<% end %> 

Вот контроллер:

def new 
    @kejsu = Kejs.new 
end 

def create 
    @kejsu = Kejs.new(params[:kejsu]) 
    if @kejsu.save 
     redirect_to kejs_index_path 
    else 
     render "new" 
    end 
end 

После нажатия кнопки отправки только временные метки. Вот фрагмент из рельсов сервер:

Started POST "/cases" for 192.168.56.1 at 2013-12-10 23:11:03 +0000 
Processing by KejsyController#create as HTML 
    Parameters: {"utf8"=>"â",   "authenticity_token"=>"Sr2ssiwtRtk9pRT5VfuDFglsEmGnjzwVkRGGBSb2zhA=", "kejs"=> {"name"=>"aa", "site_id"=>"3"}, "commit"=>"Create"} 
    (0.1ms) begin transaction 
    SQL (5.1ms) INSERT INTO "kejs" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", Tue, 10 Dec 2013 23:11:03 UTC +00:00], ["updated_at", Tue, 10 Dec 2013  23:11:03 UTC +00:00]] 
    (4.0ms) commit transaction 
Redirected to http://192.168.56.101:3000/cases 
Completed 302 Found in 14ms (ActiveRecord: 9.2ms) 

Как вы можете видеть эти поля передаются как параметры, но ВСТАВИТЬ не вставляет их вообще.

Я пробовал это с по умолчанию спокойной маршрутизации, написав свои собственные маршруты, и это не работает в любом случае.

В качестве бонуса моих маршрутов:

get 'cases' => 'kejsy#index', as: :kejs_index 
    get 'cases/new' => 'kejsy#new', as: :new_kejs 
    post 'cases' => 'kejsy#create' 
+1

Было бы также полезно включить модель. Похоже, из журнала, что ваше действие правильно принимает параметры и проблема в строке Kejsu.new (params [: kejsu]) – amitamb

+0

Моя модель довольно пустая, только стандартная декларация, созданная с помощью рельсов g. – toxicbeaver

ответ

1

Вашей params[:kejsu] ссылка использует :kejsu, но существуют свои параметры под params[:kejs], так что вы подбирая nil для значения.

Ключ в params определяется именем класса объекта, переданного form_for (в данном случае, т.е. Kejs), а не по имени переменной (т.е. @kejsu). Если вы думаете об этом, это имеет смысл, потому что имя переменной не равно до form_for, так как значение @kejsu - это то, что передается.

+0

Это не прямой ответ, который я искал, но вы указали мне в направлении, что искать. Сделав это небольшое изменение, Rails крикнул мне с ошибкой ForbiddenAttributesError, поэтому я немного поработал, и в результате появились «сильные параметры». Я не знал, что Rails 4 (который я использую) изменил поведение при работе с параметрами. Но доводя итог: я использовал 'require' и' allow' на 'params', и он работал как шарм. Я отправлю его в качестве ответа. – toxicbeaver

+0

:-) Я собирался сказать что-то о сильных параметрах, но вы сказали, что у вас не было никаких ошибок, поэтому я начал искать в другом месте. –

+0

Я очень новичок в рельсах, и я до сих пор не совсем понимаю, почему я должен использовать ': kejs', а не': kejsu'. Читая учебники, я думал, что 'params [: kejsu]' - это объект, на который я ссылаюсь, заданный в '<% = form_for @kejsu do | f | %> ', но, я думаю, я понял это неправильно. – toxicbeaver

0

для отладки вы можете использовать render :text => params.inspect внутри контроллера, поэтому я изменить мой код, как этот

def create 
    render :text => params.inspect 
end 

Теперь иди и заполните форму. Что такое имя ключа внутри ваших параметров? Это kejsu или kejs?

Если его kejs, чем вы можете изменить свой код

def create 
    @kejsu = Kejs.new(params[:kejs]) 

    if @kejsu.save 
    redirect_to kejs_index_path 
    else 
    render "new" 
    end 
end 
0

Как и было обещано, ответ с сильными параметрами:

def create 
    @kejsu = Kejs.new(kejs_params) 

    if @kejsu.save 
     redirect_to kejs_index_path 
    else 
     render "new" 
    end 
end 

def kejs_params 
    params.require(:kejs).permit(:name, :site_id) 
end 

мне нужно, чтобы изменить способ, которым я имею дело с параметрами, передаваемыми через форму путем создания нового метода, который позволяет заданные поля. Теперь он работает так, как предполагалось.

Спасибо за все советы.

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