Ruby on rails RubyonRails,未定义的方法合并
首先,请允许我为那些有经验的人提出一个简单的问题,但对我来说,现在这个问题很难回答。在其中一个视图/_form.html.erb中的Rails中,我想更改下面的行(它可以工作): 某人能帮我解决这个问题吗?使用此方法(如果您已经有当前用户可用的方法): 然后,在您看来,您可以执行以下操作:Ruby on rails RubyonRails,未定义的方法合并,ruby-on-rails,ruby,Ruby On Rails,Ruby,首先,请允许我为那些有经验的人提出一个简单的问题,但对我来说,现在这个问题很难回答。在其中一个视图/_form.html.erb中的Rails中,我想更改下面的行(它可以工作): 某人能帮我解决这个问题吗?使用此方法(如果您已经有当前用户可用的方法): 然后,在您看来,您可以执行以下操作: <%= f.hidden_field :user_id, :value => @current_user.id %> (您还可以在创建用户的create操作中放置以下内容:session[
<%= f.hidden_field :user_id, :value => @current_user.id %>
(您还可以在创建用户的create
操作中放置以下内容:session[:user\u id]=user.id
。)
您还可以在此模块中定义当前用户
方法:
# 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
以下是您可以在此模块中添加的其他一些有用的帮助器方法:
# 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
最后,我建议您看看gem,它是一种非常流行的Rails应用程序身份验证解决方案。此错误意味着它需要一个散列,但您正在放置一个空符号 你需要发送一个散列 如果您有当前的用户方法:
<%= f.hidden_field :user_id, :value => current_user.id %>
并在视图中保留相同的代码
前两个答案是正确的。原因如下
f.hidden_field
是您在该部分或包含该部分的文件/部分中创建的表单对象上的方法。Hristo Georgiev链接的文档用于ActionView::Helpers::FormHelper
()中的hidden_字段
方法。您试图调用的是来自ActionView::Helpers::FormBuilder
()
hidden_字段
的工作方式与您期望的一样,即
hidden_field(:user_object, :id)
这是两种不同的方法
f.hidden_field
的工作方式有点不同,因为它已经可以访问用于构建隐藏字段的一些信息。它需要一个方法调用form对象和一个可选的哈希,该哈希将转换为隐藏字段上的属性(因此: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查看
TL;DR
您正在使用
FormHelper\hidden\u字段所需的参数调用FormBuilder\hidden\u字段
大建议:永远不要相信用户的输入。在控制器中进行双重检查,以确保给定的用户id与连接的当前用户相匹配(或最终直接在控制器中设置用户id,而不是在视图中使用隐藏字段)良好。我不需要以表格的形式发送。因此,根据您的建议和Rakibul评论中的代码:@current_user=user.find(params[:user_id]),我应该更新控制器。因此,现在我有了一个场景,即我已登录用户,他/她添加了一个新订单。我需要为该订单分配一个正确的用户id。如何不以表单形式发送?您不应该信任这些参数,params[:user\u id]
可以手动修改。您的应用程序和最终用户之间可能有一个会话,在该会话中存储用户id(通常,取决于您的用户会话解决方案)。使用此选项设置正在创建/更新的对象的用户id
。类似于Item.create(params[:Item].merge(user\u id:current\u user.id))
您可以实际执行:@current\u user=user.find(session[“user\u id]”)
谢谢您指点我设计。我检查了它,感谢当前的用户方法,我可以随时访问用户id:)是的。Desive很有用,有许多您需要的帮助方法。那么为什么要重新发明轮子呢?:)
id = User.find(someid)
hidden_field(:user_object, :id)
form_for(@user) do |f|
...
end
f.hidden_field(:id)
<input type="hidden" id="user_id" name="user[id]" value="1" />