【问题标题】:NoMethodError in ProfilesController#createProfilesController#create 中的 NoMethodError
【发布时间】:2011-07-19 07:58:08
【问题描述】:

我正在尝试为 Profiles 创建一个关联的表单,但由于某种原因,当我点击提交按钮时,我得到一个 NoMethodError,这对我来说没有意义,因为我的代码与我的教程完全相同我正在关注...除非教程已过时..

def create
@user = User.find(params[:user_id])
@profile = @user.profiles.create(params[:profile])
redirect_to user_path(@user)
end

有人知道我为什么会收到 noname 错误吗? 属于控制器的表格如下: https://github.com/imjp/SuperModel/blob/master/app/views/users/show.html.erb


编辑 1: 已修复!以下代码未在 http://localhost:3000/users/2(即 profile#show)处显示配置文件数据:<%= @user.profile.first_name %>

这是我目前的个人资料#show
def show
@user = User.find(params[:user_id])
@profile = @user.profile.find(params[:id])
end

编辑 2: 我已经更新我的 github 仓库https://github.com/imjp/SuperModel

【问题讨论】:

  • 您可以尝试使用create_profile! (使用 ! bang 版本)检查是否引发任何异常。可能是配置文件模型上的验证错误或 attr_accessible/protected 集。
  • 不,它不起作用。我已经在上面粘贴了我的显示操作。知道什么可能导致该操作引发此错误吗? undefined method 'first_name' for nil:NilClass
  • 无需额外查找配置文件,只需 @profile = @user.profile
  • def show @user = User.find(params[:user_id]) @profile = @user.profile end 虽然不起作用..我仍然得到同样的错误
  • 那么配置文件没有正确创建,这是另一回事。当您创建配置文件时,请尝试使用我上面写的 bang 版本,看看是否有错误以及记录是否在数据库中正确创建,检查日志。

标签: ruby-on-rails


【解决方案1】:

为什么是@user.profiles?试试@user.profile(单数)

【讨论】:

  • 我也试过了,但是那个抛出了这个错误:undefined method 'create' for nil:NilClass
  • 因为可能 User has_one profile 构造函数不同,试试@user.create_profile(params[:profile])
  • 谢谢你!我不再收到错误了:) 不过我现在似乎无法访问存储的变量。检查我编辑的版本
【解决方案2】:

您收到 undefined method 'first_name' for nil:NilClass 是因为找不到具有该 ID 的用户。您可能发送了错误的参数或其他内容。显示操作的 URL 是什么样的?

编辑:

将您在 users_controller.rb 中的创建方法更改为此

def create
@user = User.new(params[:user])
@user.build_profile

respond_to do |format|
  if @user.save
    format.html { redirect_to @user, notice: 'User was successfully created.' }
    format.json { render json: @user, status: :created, location: @user }
  else
    format.html { render action: "new" }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
 end
end

更改后,将 app/views/users/show.html.erb 中的表单更改为此

<h3>Add Profile</h3>
<%= form_for([@user, @user.profile]) do |f| %>
<div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
</div>
<div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
</div>
<div class="field">
    <%= f.label :picture %><br />
    <%= f.text_field :picture %>
</div>
<div class="field"> 
    <%= f.radio_button(:sex, "male") %>
    <%= f.label(:sex, "Male") %>
    <%= f.radio_button(:sex, "female") %>
    <%= f.label(:sex, "Female") %>
</div>
<div class="actions">
    <%= f.submit %>
</div> 
<% end %>

它会起作用的。您的用户配置文件关联未建立。

【讨论】:

  • 还是不行 :( 用户 has_one :profile Profile belongs_to :user
  • 嘿感谢更新人!我觉得我们快到了。我现在收到以下错误undefined method 'model_name' for NilClass:Class 在 Showing c:/rails/supermodel/app/views/users/show.html.erb where line #20 raise:
  • 我刚刚下载了您的 github 代码,在视图中更改了表单并编辑了我的表单,它可以在这里工作。我想您正在更改本地仓库中的某些内容,因此请执行此操作git reset --hard dbdc1b6,这会将您重置为公开提交。然后在控制器和视图中更改您的代码,它必须工作:D
  • 我修复了它:D 我刚刚浏览了来自 ruby​​onrails.org 的 getting started 指南,该指南与我想要实现的结构相似,但是是复数形式。所以我把它单数化了,它现在可以正常工作了.. 奇怪的大声笑
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多