0

我应该将参数从表单发送到控制器,然后将它们发送到模型。我需要在模型中检查它们。请帮助... 表格:

<form action="questions">
<input type="text" name="user_name_param" /><br>
<input type="text" name="user_email_param" /><br>
<input type="submit" name="send" />
</form>

问题控制器:

user_id = User.new.check_user(params[:user_name_param], params[:user_email_param])

用户模型:

validates :name_param,  :presence => true, 
                :length => {:minimum => 1, :maximum => 254}

validates :email_param, :presence => true, 
                :length => {:minimum => 3, :maximum => 254},
                :uniqueness => true,
                :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}

 def check_user(name_param, email_param)
 if (name_param && email_param).valid?
 User.where(:user_name => name_param, :user_email => email_param).first.try(:id) || false
 else render :template => "questions/auth_form"
 end

结尾

我有未定义的方法“有效吗?” 对于 nil:NilClass错误。

4

1 回答 1

0
  • 首先,这种形式确实非常规。阅读有关form_tagform_for和 FormHelpers 的信息。

  • 其次,if (name_param && email_param).valid?是错误的。name_param && email_param执行布尔运算,如果两者都为真,则返回第二个结果;否则NilClass在这种情况下。valid?没有在这些类上定义,它是为 ActiveRecord 对象定义的。

  • 第三,render :template => "questions/auth_form"又错了。render是 ActionController 方法。你不能在你的模型中这样使用它;这种类型的逻辑应该存在于您的控制器中。

一般解决方案
您可能正在尝试查找与该电子邮件和姓名匹配的用户;否则呈现授权页面。也许这个控制器逻辑就足够了:

@user = User.where(["user_name = ? and user_email = ?", params[user_name_param], params[user_email_param]])
if @user.valid? 
  #DO this
else
  #render that
end

#find_by对于 Rails 4。

于 2013-06-09T21:51:23.487 回答