ruby-on-rails - Ruby on Rails,未定义的方法合并

标签 ruby-on-rails ruby

首先,请允许我向有经验的人提出简单的问题,但现在对我来说很难。在 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/

相关文章:

ruby-on-rails - SQLite3::BusyException

Ruby 加权循环法

ruby-on-rails - 如何使用 ruby​​ on rails 生成人类可读的时间范围

Ruby strftime ("%Q") 坏了?

ruby - 对数字密码进行排名的算法?

css - React 样式组件未显示在屏幕上

ruby-on-rails - 如何在 heroku 上部署 Action 电缆?

ruby-on-rails - Ruby on Rails - 路由错误,转到 "show"而不是 "index"

ruby-on-rails - 从私有(private) NIC 访问时,Rails 显示 IP 为 127.0.0.1,但 Nginx 显示正确的 IP。公共(public) IP 可以正常转发

ruby - 在 Ruby 中,循环中的返回值是什么?