我是一名新的rails开发人员,我目前正在开发一个项目,用户可以在该项目中发布参数。 (或对帖子发表评论) 我有一个设计用户模型,一个投票模型和一个参数模型。
我的问题是我似乎无法访问用户属性,所以我可以在我的视图中将<%= argument.user.first_name %>
添加到参数中。
我的问题是argument.user.first_name返回此错误:undefined method
first_name'为nil:NilClass`
当我尝试<%= argument.vote.title %>
时,它的效果非常好。
当我去控制台找到投票和参数时,argument.user.first_name
我得到了正确的名字。
迁移看起来像这样:
create_table "arguments", force: true do |t|
t.string "title"
t.text "argument"
t.integer "vote_id"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
end
所以我拥有来自用户的外键和参数表中的投票。
我在投票和用户上添加了“has_many”关系。所以用户和投票都是has_many:arguments。
我的参数控制器看起来像这样:
class ArgumentsController < ApplicationController
before_filter :current_user
def create
@vote = Vote.find(params[:vote_id])
@argument = @vote.arguments.build(params[:argument].permit(:argument))
@argument.user_id = current_user.id
@argument.save!
if @argument.save
redirect_to @vote
else
render 'new'
end
end
private
def argument_params
params.require(:argument).permit(:title, :argument)
end
end
我找到了带有id的投票并在该投票上创建了评论。 我试图传递user_id,所以我能够访问用户表,如图片,first_name等。
我的论点_form:
<div class="well clearfix">
<h2>Tilføj et argument</h2>
<%= form_for([@vote, @vote.arguments.build]) do |f| %>
<%= f.hidden_field :user_id, :value => @current_user.id %>
<p><%= f.label :Bruger %><br>
<%= current_user.first_name %>
<p><%= f.label :Titel %><br>
<%= f.text_field :title %></p>
<p><%= f.label :Argument %><br>
<%= f.text_area :argument %>
<p><%= f.submit 'Opret', class: 'btn btn-primary' %></p>
<% end %>
</div>
我使用vote_id构建参数 并使用_arguments显示它:
<% @vote.arguments.each do |argument| %>
<%= div_for(argument, class: 'col-md-4 well clearfix') do |argument| %>
<h2><%= argument.title %></h2>
<%= argument.argument %>
<p>Af:
<%= argument.user_id %>
<%= argument.user.first_name %>
<% end %>
<% end %>
对我来说,似乎没有使用create argument方法正确传递user_id?
在我的路线中,我将参数作为投票的嵌套资源:
devise_scope :user do
resources :users, only: [:show]
end
root 'votes#index'
resources :votes do
resources :arguments
end
希望你们中的一位能帮助我,引导我朝着正确的方向前进! 在此先感谢:)
答案 0 :(得分:2)
您需要在控制器中对用户进行身份验证,例如: -
before_filter :authenticate_user!
更改参数控制器: -
class ArgumentsController < ApplicationController
before_filter :authenticate_user!
def create
@vote = Vote.find(params[:vote_id])
@argument = @vote.arguments.build(argument_params)
if @argument.save
redirect_to @vote
else
render 'new'
end
end
private
def argument_params
params.require(:argument).permit(:title, :argument, :user_id)
end
end
参数形式将@current_user更改为current_user:
<%= f.hidden_field :user_id, :value => current_user.id %>
此外,您不需要在隐藏字段中发送用户ID,因为如果用户登录,我们可以在控制器中获取当前用户,然后您可以在控制器中为参数分配user_id,如: -
@argument.user_id = current_user.id
答案 1 :(得分:0)
由于您的argument
模型有belongs_to :user
,因此您可以指定@argument.user = current_user
而不是ID。由于current_user
已经加载,因此开销很小,只有argument
无法重新加载
与问题无关,但需要修复:
save
/ save!
的两次调用很奇怪,通常只需要一次,特别是在代码中稍后检查保存是否成功时(现在您将在验证错误时遇到异常)形式渲染)argument_params
来电被params[:argument].permit(:argument)
替换(如果您遇到没有nil
的请求,则会产生关于argument
的错误,而不是必需的参数。user_id
隐藏字段被强参数丢弃,最好将其删除(并且不允许可能的冒名顶替者)答案 2 :(得分:0)
探测是我在参数之前渲染表单(创建参数)。这创建了一个空参数div / object,它不包含任何内容。所以错误总是在那个空对象上(obv确实包含了用户信息,因为它是空的)
所以你的答案是正确的,但我的问题是错的,哈哈 好的,谢谢你的时间!
在我的show.html中,我添加了
<%= render 'arguments/argument' %>
<div class="jumbotron">
<%= render 'arguments/form' %>
</div>