2015-07-19 95 views
2

我無法弄清楚如何在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

試試這個:'<%= form_for [@ task.user,@task] do | f | %>' – Deep

+0

@Deep相同的錯誤 –

+0

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

回答

3

你有nested_routestasksusers,所以改變你form_for像下面應該解決您的問題

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

工作,謝謝。但由於某種原因,它不能保存給特定用戶。當我打開用戶的任務列表時,沒有這些任務。 –

+0

@AlexanderShmatko我沒有得到你。 – Pavan

+0

@AlexanderShmatko在控制器中,你無處分配給用戶任務,這就是爲什麼,或者你可以在強參數中添加它,或者代替'Task.new',你可以使用'current_user.tasks.build' – Deep

1

可以請你試試這個:

<%= 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'值'<%= form_for([parent_object,child_object])do | f | %>' – Prashant4224

+0

感謝您提供有用的信息。而且current_user值與某個用戶的id有什麼不同? –

1

看到它似乎航線您需要允許管理員/用戶爲任何用戶創建任務。因此,對於這個第一次在你的控制器中添加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

對我來說無價的信息。對不起,我已經接受了另一個答案。但是,你的帖子不是那麼有幫助) –