form_for帮助程序

时间:2015-07-19 18:04:30

标签: ruby-on-rails ruby-on-rails-4

我无法弄清楚如何在form_for中正确编写url路径来创建新对象。我尝试以不同的方式做到这一点,但没有运气。我想有一些特殊形式的url可以包含对象的id。 enter image description here

视图/任务/ 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>

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

nested_routestasks 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任务,则可以使用上述答案。