form_for helper中的路径不正确

问题描述:

我无法弄清楚如何在form_for中正确写入一个url路径来创建一个新对象。我试图以不同的方式做,但没有运气。我想有一些特定形式的url可以包含对象的id。 enter image description hereform_for helper中的路径不正确

视图/任务/ new.html

<%= form_for :task, url: [@task.user, @task] do |f| %> 

    <p> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </p> 

    <p> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </p> 

    <p> 
    <%= f.hidden_field :user_id, value: params[:user_id] %> 
    <%= f.submit %> 
    </p> 

<% end %> 

耙路由

enter image description here

控制器/ tasks_controller.rb

class TasksController < ApplicationController 
before_filter :authorize, only: [:edit, :new, :destroy] 

    def index 
    @tasks = Task.where(user_id: params[:user_id]) 
    end 

    def show 
    @task = Task.find(params[:id]) 
    redirect_to users_path 
    end 

    def edit 
    @task = Task.find(params[:id]) 
    end 

    def new 
    @task = Task.new 
    end 

    def create 
    @task = Task.new(task_params) 

    if @task.save 
     redirect_to @task 
    else 
     render 'new' 
    end 
    end 


    def update 
    @task = Task.find(params[:id]) 

    if @task.update(task_params) 
     redirect_to @task 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @task = Task.find(params[:id]) 
    @task.destroy 
    respond_to {|format| format.js } 
    end 

    private 

    def task_params 
    params.require(:task).permit(:title, :description) 
    end 
end 

的意见/任务/ index.html的

<p align="right"><%= link_to 'Users', users_path %> <%= link_to 'Tasks', user_tasks_path %></p> 
<h3>Tasks database</h3> 
<table> 
<% @tasks.each do |task| %> 
<tr id="task_<%= task.id %>"> 
    <td> 
    <b>Title:</b> 
    <i> <%= task.title %></i> 
    </td> 

    <td> 
    <b>Description: </b> 
    <i><%= task.description %></i> 
    </td> 

    <td> 
    <%= link_to 'Edit', edit_user_task_path(task.user, id: task.id) %> 
    </td> 
    <td> 
    <%= link_to 'Delete', user_task_path(task.user, id: task.id), 
     data: { confirm: 'Are you sure?' }, :method => :delete, remote: true %> 
    </td> 
</tr> 
<% end %> 

<tr> 
    <td><%= link_to 'Create task', new_user_task_path %></td> 
    <td><%= link_to 'Back to Users', users_path %></td> 
</tr> 

</table> 

有人能帮忙吗?

+1

试试这个:'' – Deep

+0

@Deep相同的错误 –

+0

仅使''%= form_for @task,url:new_user_task_path(@ task.user)do | f | %>' – Deep

你有nested_routestasksusers,所以改变你form_for像下面应该解决您的问题

<%= form_for [current_user, @task] do |f| %> 
+0

工作,谢谢。但由于某种原因,它不能保存给特定用户。当我打开用户的任务列表时,没有这些任务。 –

+0

@AlexanderShmatko我没有得到你。 – Pavan

+0

@AlexanderShmatko在控制器中,你无处分配给用户任务,这就是为什么,或者你可以在强参数中添加它,或者代替'Task.new',你可以使用'current_user.tasks.build' – Deep

可以请你试试这个:

<%= form_for([current_user, @task]) do |f| %> 

    <p> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </p> 

    <p> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </p> 

    <p> 
    <%= f.hidden_field :user_id, value: params[:user_id] %> 
    <%= f.submit %> 
    </p> 
+0

这实际上不起作用。 –

+0

希望你有'current_user'值'' – Prashant4224

+0

感谢您提供有用的信息。而且current_user值与某个用户的id有什么不同? –

看到它似乎航线您需要允许管理员/用户为任何用户创建任务。因此,对于这个第一次在你的控制器中添加before_action

before_action :find_user 

def find_user 
    @user = User.find(params[:user_id]) 
end 

然后在你形成不喜欢它:

<%= form_for [@user, @task] do |f| %> 

然后在您的控制器的create动作做这样:

def create 
    @task = @user.tasks.build(task_params) 

    if @task.save 
     redirect_to @task 
    else 
     render 'new' 
    end 
    end 

当您需要为许多用户保存任务时,可以使用以上方法,如果您需要只保存current_user任务,则可以使用上述答案。

+1

对我来说无价的信息。对不起,我已经接受了另一个答案。但是,你的帖子不是那么有帮助) –