Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails,未定义的方法合并_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails,未定义的方法合并

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[

首先,请允许我为那些有经验的人提出一个简单的问题,但对我来说,现在这个问题很难回答。在其中一个视图/_form.html.erb中的Rails中,我想更改下面的行(它可以工作):

某人能帮我解决这个问题吗?

使用此方法(如果您已经有当前用户可用的方法):

然后,在您看来,您可以执行以下操作:

<%= 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" />