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