一开始,请为那些经验丰富的人提供简单的问题,但对我来说现在很难。在其中一个视图/ _form.html.erb的Rails中,我想更改下面的行(它可以工作):
<%= f.collection_select :user_id, User.all, :id, :email %>
进入隐藏字段,该字段将保存已登录用户的ID。我尝试将其更改为:
<% f.hidden_field :user_id, :id %>
但它会引发错误:
NoMethodError in Orders#new
undefined method `merge' for :id:Symbol
可以帮助我解决这个问题吗?
答案 0 :(得分:1)
这个错误意味着它需要一个哈希值,但是你要放一个空符号。
您需要发送哈希
如果你有current_user方法:
/* tasks/minifyCss.js */
var gulp = require('gulp');
var minifyCss = require('gulp-minify-css');
module.exports = function() {
return gulp.src('css/*.css')
.pipe(minifyCss())
.pipe(gulp.dest('dist'));
};
如果不这样做,您可以在控制器中使用它
<%= f.hidden_field :user_id, :value => current_user.id %>
并在视图中保留相同的代码。
答案 1 :(得分:1)
前两个答案是正确的。这就是
的原因 f.hidden_field
是您在某个部分或在包含它的文件/部分中创建的表单对象上的方法。由Hristo Georgiev链接的文档适用于来自hidden_field
(link)的ActionView::Helpers::FormHelper
方法。您尝试拨打的电话号码来自ActionView::Helpers::FormBuilder
(link)
hidden_field
就像你似乎期待它一样工作,即
hidden_field(:user_object, :id)
这是两种不同的方法
f.hidden_field
的工作方式略有不同,因为它已经可以访问用于构建隐藏字段的一些信息。它期望一个方法调用表单对象和一个可选的哈希值,它将它转换为隐藏字段上的属性(因此:value => user.id
哈希)
假设你有以下表格
form_for(@user) do |f|
...
end
你希望id成为一个隐藏的字段,你可以把它放在那个块中
f.hidden_field(:id)
这将生成以下HTML
<input type="hidden" id="user_id" name="user[id]" value="1" />
请参阅ActionView的this line
<强> TL; DR 强>
您使用FormBuilder#hidden_field
预期的参数调用FormHelper#hidden_field
方法
答案 2 :(得分:0)
使用此选项(如果您已有current_user
方法可用):
<%= f.hidden_field :user_id, :value => current_user.id %>
如果您没有实施current_user
方法,在相应的控制器中,您可以使用以下内容:
@current_user = User.find(params[:user_id])
然后,在您看来,您可以这样做:
<%= f.hidden_field :user_id, :value => @current_user.id %>
在上述对话之后,如果你想使用session存储user_id,那么你可以这样做。
您可以创建一个SessionsHelper
模块(可以包含在ApplicationController
中),您可以在其中定义log_in
方法:
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
(您也可以将此session[:user_id] = user.id
放在您创建用户的create
操作中。)
您还可以在此模块中定义current_user
方法:
# Returns the current logged-in user (if any).
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
以下是您可以在此模块中添加的一些其他有用的辅助方法:
# Returns true if the given user is the current user.
def current_user?(user)
user == current_user
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Logs out the current user.
def log_out
session.delete(:user_id)
@current_user = nil
end
最后,我建议你看一下Devise gem,它是Rails应用程序非常流行的身份验证解决方案。