有类似的问题,但是在阅读它们的18小时后,几位导游尝试并尝试我仍然无法解决我的问题。这就是我发布这个问题的原因。提前致谢!
尝试POST数据以创建新记录但是“param缺失或值为空:todo”
FORM
<div class="addactionform">
<%= form_for(Action.new, :url => { action: "create" }) do |todo| %>
<div class="input-field"> <%= todo.text_field :title %> </div>
<div class="hidden"> <%= todo.submit %> </div>
<% end %>
</div>
ROUTE
root 'actions#inbox'
get '/actions' => 'actions#inbox'
post '/actions/create' => 'actions#create', as: :create
CONTROLLER
class ActionsController < ApplicationController
def inbox
@todos = Action.all
end
def new
@todo = Action.new
end
def create
@todo = Action.new(todo_params)
@todo.save
redirect_to(:action => 'inbox')
end
private
def todo_params
params.require(:todo).permit(:title)
end
end
行动模式
class Action < ActiveRecord::Base
has_many :tag, through: :action_tags
belongs_to :folder
belongs_to :user
belongs_to :state
end
迁移
class CreateActions < ActiveRecord::Migration
def change
create_table :actions do |t|
t.string :title
t.text :note
t.references :tags
t.integer :assignee_id
t.references :state
t.datetime :due_at
t.integer :parent_id
t.references :folder
t.timestamps
end
end
end
答案 0 :(得分:1)
感谢所有帮助。我终于能够以这种方式解决问题了:
查看
<%= form_for Action.new, as: :todo do |action| %>
<div class="input-field"><%= action.text_field :title %></div>
<div class="hidden"><%= action.submit %></div>
<% end %>
控制器
def create
@action = Action.create(action_params)
redirect_to(:action => 'inbox')
end
private
def action_params
params.require(:todo).permit(:title)
end
end
我在VIEW中将Action.new命名为todo“as :: todo”的部分是因为我的模型被称为Action,因为Rails默认发送一个包含该动作的动作参数,我返回的名称是请求作为字符串的行动。
部分解决方案是感谢@ guilherme-franco对以下内容的回答。 Rails 4, strong parameters, nested resources, build and undefined method permit
答案 1 :(得分:0)
表格中的这一行
<%= form_for(Action.new, :url => { action: "create" }) do |todo| %>
应该是这样的
<%= form_for(@todo, :url => { action: "create" }) do |todo| %>
并且您的todo_params
应该是这样的
def todo_params
params.require(:action).permit(:title)
end
答案 2 :(得分:0)
您有一个名为Action
的模型,因此Rails无法将其名称映射到"todo"
参数。我很确定您的代码会呈现名称为"action[title]"
的HTML输入标记。因此params.require(:todo).permit(:title)
找不到"todo"
输入,因为它们被命名为"action"
。
尝试在form_for
中使用符号:
<%= form_for(:todo, url: actions_create_path) do |todo| %>
或者只是在:action
中使用params.require
(就像@Pavan所说的那样):
params.require(:action).permit(:title)