Ruby on Rails,undefined方法合并

时间:2015-09-03 20:49:23

标签: ruby-on-rails ruby

一开始,请为那些经验丰富的人提供简单的问题,但对我来说现在很难。在其中一个视图/ _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

可以帮助我解决这个问题吗?

3 个答案:

答案 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 %>

并在视图中保留相同的代码。

Look @ the documentation for more info

答案 1 :(得分:1)

前两个答案是正确的。这就是

的原因

f.hidden_field是您在某个部分或在包含它的文件/部分中创建的表单对象上的方法。由Hristo Georgiev链接的文档适用于来自hidden_fieldlink)的ActionView::Helpers::FormHelper方法。您尝试拨打的电话号码来自ActionView::Helpers::FormBuilderlink

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应用程序非常流行的身份验证解决方案。