Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从表单获取所选值。选择_Ruby On Rails - Fatal编程技术网

Ruby on rails 从表单获取所选值。选择

Ruby on rails 从表单获取所选值。选择,ruby-on-rails,Ruby On Rails,我有两个模型-project和todo,该项目包含许多todo。我正在尝试编写一个表单,将todo添加到一个特定的项目中,该项目已在任务栏中选中 不幸的是,我犯了一个错误 找不到具有“id”的项目= 当我重定向到/todos时,从todos\u控制器 @project=project.findparams[:project\u id] /projects/index.html.erb <h1> Задачи </h1> <% @projects.each do |p

我有两个模型-project和todo,该项目包含许多todo。我正在尝试编写一个表单,将todo添加到一个特定的项目中,该项目已在任务栏中选中

不幸的是,我犯了一个错误

找不到具有“id”的项目=

当我重定向到/todos时,从todos\u控制器

@project=project.findparams[:project\u id]

/projects/index.html.erb

<h1> Задачи </h1>
<% @projects.each do |project_name|%>
<h3><%= project_name.title %></h3>
<ul>    
<% project_name.todos.each do |project_todo| %>
<li>
<p><%=  project_todo.text %></p>
</li>
<% end %>
</ul>
<% end %>
<h1> Новая задача </h1>
<%= form_with scope: :todo, url: todos_path, local: true do |form| %>
<p>
<% form.label :text %><br>
<%= form.text_field :title, placeholder: "Название задачи" %>
</p>
<%= form.select( :project_id, options_from_collection_for_select(Project.all, :id, :title)) %>
<p>
<a href="/projects">ОТМЕНА</a>
<%= link_to form.submit  %>
</p>
<% end %>
我也无法将“提交”按钮显示为文本链接。

您的控制器需要一个可能未传递的项目id参数!在触发ToDoCreate方法时,尝试将项目id添加到参数哈希中

  def create
    @project = Project.find(params[:todo][project_id])
    @todo = @project.todo.create(todo_params)
    redirect_to projects_path
  end
  def create
    @todo = Todo.create(todo_params)
    redirect_to projects_path
  end
如果不起作用,则检查服务器日志中的参数散列,并检查项目id是否存在于参数中

以上将工作,但我认为你们不需要找到项目,若你们修改创建行动为

  def create
    @project = Project.find(params[:todo][project_id])
    @todo = @project.todo.create(todo_params)
    redirect_to projects_path
  end
  def create
    @todo = Todo.create(todo_params)
    redirect_to projects_path
  end
还将方法定义为

def todo_params
  params.require(:todo).permit(:project_id, :title)
end

params[:project_id]为零,因为您提交的todo表单,因此您需要以 创建操作中的Project.findparams[:todo][Project_id]。 因此,请按如下所示替换您的创建操作 def创建 @project=project.findparams[:todo][project\u id] @todo=@project.todo.createtodo_参数 将\u重定向到项目\u路径 终止
别忘了在todo参数方法中包含项目id。

您能在问题中添加出现错误时访问的路径吗?在path/todos中。您能在问题中添加路由代码吗?当然,我添加了。当我尝试添加todo时,我得到一个未定义的错误局部变量或方法。。。你是说?到@todo=todo.createtodo_params行中的_param,当我将其更改为@todo=todo.createparams[:text]时,我发送了一个空的todohave your defined method with name todo_params no,我复制了这个,这意味着这是标准方法,无法向新的todo发送文本。到目前为止,我已经将validation`validates\u presence\u of:text`添加到模型中,以避免添加空todosplease在todo\u参数中添加与title相同的其他参数
def todo_params
  params.require(:todo).permit(:project_id, :title)
end