【问题标题】:Could not find User without an id - Rails找不到没有 id 的用户 - Rails
【发布时间】:2015-09-20 08:14:46
【问题描述】:

我刚刚开始使用 Rails。我有一个模型,“用户”,它有很多“列表”。在用户显示视图中,我创建了一个表单来为当前用户创建一个列表。提交表单时出现以下错误:

找不到没有 ID 的用户

我认为我设置嵌套列表表单的方式有问题。

用户 -> show.html.erb

    <p id="notice"><%= notice %></p>

<p>
  <b>Username:</b>
  <%= @user.username %>
</p>

<p>
  <b>Password:</b>
  <%= @user.password %>
</p>

<p>
  <b>Email:</b>
  <%= @user.email %>
</p>

<h2>Add a List</h2>
 <%= form_for([@user, @user.lists.build]) do |f| %>
 <div class ="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
</div>
<div class="field">
    <%=f.label :description%><br />
    <%=f.text_field :description%>
</div>
<div class="actions">
    <%= f.submit %>
</div>

<% end %>



<%= link_to 'Edit User', edit_user_path(@user) %> |
<%= link_to 'Back to Users', users_path %>

这是列表“创建”控制器操作。

 class ListsController < ApplicationController
    def create
        @user = User.find(params[:id])
        @list = @user.lists.create(params[:list])
        redirect_to user_path(@user)        
    end
end

更新:在 UserController 上显示方法

 # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

更新:我的路线

    resources :users do
      resources :lists
  end

  get "home/index"

params[:id] 不知何故为零?我错过了什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    确保您在创建操作中使用params[:user_id],而不是params[:id]

    class ListsController < ApplicationController
        def create
            @user = User.find(params[:user_id]) 
            @list = @user.lists.create(params[:list])
            redirect_to user_path(@user)        
        end
    end
    

    【讨论】:

    • 哦。那讲得通!我会尽快试试这个。谢谢
    【解决方案2】:

    你可以试试这个吗?由于这不是 RESTUL 路由(请参阅 http://guides.rubyonrails.org/form_helpers.html),您可能必须在 form_for 标记中指定您希望表单命中的 URL(控制器和操作)。如果这仍然没有传递用户 ID,您还可以使用 hidden_​​field 在表单中显式传递它。如果这不起作用,请告诉我...

    在视图中(show.html.erb)

    <h2>Add a list</h2>
    <%= form_for [@user, @list] do |f| %>
    <div class ="field">
    
    <%= f.label :title %><br />
    <%= f.text_field :title %>
    
    <%=f.label :description%><br />
    <%=f.text_field :description%>
    
    <%= f.submit %>
    <% end %>
    

    在用户控制器中:

    class UsersController < ApplicationController
      def show
        @user = User.find(params[:id])
        @list = @user.list.new
      end
    end
    

    在 Lists 控制器中:

     class ListsController < ApplicationController
       def create
         @user = User.find(params[:user_id])
         @list = @user.lists.build(params[:list])
         @list.save
         redirect_to @user # or wherever
       end
    end
    

    【讨论】:

    • 谢谢你。但是,我收到相同的错误消息。我基本上是在改编 ruby​​onrail.org 网站上的博客教程。 guides.rubyonrails.org/…
    • 我只是尝试使用快速应用进行复制,似乎对我有用。你的路线是什么?如果您嵌套了路线,则上述方法将起作用,即资源:用户做资源:列表结束也会查看rails guides示例应用程序......
    • 和最后一条评论...如果您将 user_id 作为列表中的外键,请确保它们属于 belongs_to/has_many 关系...
    • 我相信我的路线创建正确。我已经更新了我的帖子以显示这一点。谢谢!
    • @Nick:你确定你的创建操作中有@user = User.find(params[:user_id]) 吗? (而不是@user = User.find(params[:id])
    【解决方案3】:

    至少在 Rails 4 中(不确定以前的版本),如果您在新视图中为某些内容在表单中传递一个参数,如果您想在创建操作中调用该参数,则需要稍微修改调用到resource_name_params[:user_id] 而不是简单的params[:user_id]

    具体而言,您在控制器中的 create 方法可能需要改为:

    class ListsController < ApplicationController
       def create
         @user = User.find(list_params[:user_id])
         @list = @user.lists.build(list_params)
         ...
    

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2013-03-11
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多