“param丢失或值为空:todo”(强参数问题)

时间:2015-06-21 06:16:18

标签: ruby-on-rails-4

有类似的问题,但是在阅读它们的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

3 个答案:

答案 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)