首先,请允许我向有经验的人提出简单的问题,但现在对我来说很难。在 views/_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
有人能帮我解决这个问题吗?
最佳答案
使用这个(如果您已经有可用的 current_user
方法):
<%= f.hidden_field :user_id, :value => current_user.id %>
如果你没有实现 current_user
方法,在你相应的 Controller 中,你可以有这样的东西:
@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 应用程序身份验证解决方案。
关于ruby-on-rails - Ruby on Rails,未定义的方法合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32385181/