我无法弄清楚如何在form_for中正确编写url路径来创建新对象。我尝试以不同的方式做到这一点,但没有运气。我想有一些特殊形式的url可以包含对象的id。
视图/任务/ 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 %>
佣金路线
控制器/ 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>
有人可以帮忙吗?
答案 0 :(得分:3)
您nested_routes
和tasks
users
,因此更改form_for
如下所示应解决您的问题
<%= form_for [current_user, @task] do |f| %>
答案 1 :(得分: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>
答案 2 :(得分:1)
看到路线,您似乎需要允许admin / user为任何用户创建任务。因此,首先在控制器中添加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
任务,则可以使用上述答案。