这更多地涉及轨道理论。我想比较用户提交的字符串与填充模型中的字符串。这可能吗?即使有可能在推出的模型中创建用户并比较那里的字符串会更好吗?
是否有关于如何实现此目的的文档
我的名字有点不稳定,我从微博教程中调整了这个以尝试成为dna(用户输入) - > rna(mrna db)音序器(我明白这是非常糟糕的形式)
用户/ new.html.erb(渲染)/ _ form.hrml.erb
<%= form_for :user do |t| %>
<%= t.fields_for 'inputdna[]', [] do |p| %>
dna <%= p.text_field :dna %>
<% end %>
<%= t.submit "Submit" %>
<% end %>
用户模型
class User < ActiveRecord::Base
dna_options = 'ttt, ttc, tta'.split(',')
#validates :dna_options, presence: true
# returns true|false
def dna_valid?(user_input)
user.input.each
return false if unless dna_options.include? user_input
end
return true
end
控制器/ users_controller.rb
class UsersController < ApplicationController
# GET /users
# GET /users.json
def index
@users = User.new # not touched, however the convention would normally be User.new
end
def new
User.create(full: params['user']['full'], dna: params['user']['inputdna']['dna'], mrna: params['user']['mrna']) if User.dna_valid? params['user']['inputdna']['dna']
end
end
用户模型的seed.rb
User.create(full: "phenylalanine", dna: "ttt", mrna: "uuu")
User.create(full: "phenylalanine", dna: "ttc", mrna: 'uuc')
User.create(full: "leucine", dna: 'tta', mrna: 'uua')
答案 0 :(得分:1)
可以比较字符串,很少有方法可以做到这一点,以及围绕用户输入的难度可能是一个挑战。
假设你有一个如下的模型:
Class SomeStrings
@@some_string = 'String Answer'
end
您可以将其与某些参数的用户输入进行比较,如下所示:
params['user_input'] == SomeStrings.some_string
这将返回一个布尔值(true | false),用于if / case语句。
现在,为了确保输入匹配而不管情况如何,您有两个简单的选项:
params['user_input'].downcase == SomeStrings.some_string.downcase
或
params['user_input'].casecmp(SomeStrings.some_string)
http://ruby-doc.org/core-1.9.3/String.html#method-i-casecmp
使用casecmp的后一种方法比下两个字符串部分快得多。
现在在这个例子中我使用了一个类变量@@ some_string,但是你可以使用返回字符串的变量/方法将相同的逻辑应用于任何模型。此模型可以是活动记录,或其他ORM记录,或只是一个类。
如果你想再输入那就喊。
&LT;&GT;
如果您希望逐个用户地预先填充此模型,则需要创建一定程度的持久性。这可能是您的代码“硬编码”,数据库或会话。例如,如果要将某些用户输入与会话中存储的5个单词列表中的一个进行比较,则可以执行以下操作:
session['words_to_compare_to'] = Words.generate_five_random_words unless session['words_to_compare_to']
您可以在模型上创建一个创建单词的方法,这会将它们分配到会话中。这意味着每个用户都会得到一些单词来比较,每个用户是随机的。这可能是你的方法:
class Words
@@words_list = 'help, go, north, fred, mimi, the, and, elf'.split(",")
def generate_five_random_words
words_to_return = []
5.times{ words_to_return << @@words_list.sample }
return words_to_return
end
end
然后比较你收到的输入,看看它是否在控制器的5个随机字内,你可以这样做:
session['words_to_compare_to'].include? params['user_input'].downcase
我们在这里使用downcase,因为我们所有的单词列表都是小写的。如果在5个单词的数组中找到用户输入,则返回布尔值true | false。我希望这能提供一些你可以重用的东西。
*更新以下代码添加至问题*
我将假设用户填写文本字段并将其提交给route / user / create。我假设目的是检查用户提交的3个字母dna是否在可接受的dna列表中。
首先,让我们将可接受的dna组合添加到用户模型中:
Class User
dna_options = 'ttt, ttc, tta'.split(',')
# returns true|false
def self.dna_valid?(user_input)
dna_options.include? user_input
end
end
现在,根据您使用的ORM,您还可以使用验证器:http://guides.rubyonrails.org/active_record_validations.html
要在控制器中使用上述内容,您可以执行以下操作:
class UsersController < ApplicationController
def index
@users = Array.new # not touched, however the convention would normally be User.new
end
def create
User.create(full: params['user']['full'], dna: params['user']['inputdna']['dna'], mrna: params['user']['mrna']) if User.dna_valid? params['user']['inputdna']['dna']
end
end
现在,我在这里做了很多假设,因为你的代码缺少与模型相同的实体,但是我希望你能看到可以做些什么。如果params ['user'] ['inputdna']返回一个数组,您可以将代码更改为:
if user.dna_valid? params['user']['inputdna']
并将模型中的布尔运算符更改为:
# returns true|false
# expects user_input to be an array
def self.dna_valid?(user_input)
user.input.each do |dna|
return false if unless dna_options.include? dna
end
return true
end
如果在dna_options中找到所有实体,则返回true;如果其中一个实体未找到,则返回false
答案 1 :(得分:0)
如果您只想比较和找到完全匹配,那么这就是我使用的。
all_users = params[:user][:dna].map do |u|
User.find_by(name: u)
end
在这里,您将从“params [:user]”中获取表单提交的响应,然后使用“User.find_by(name:u)”将该响应与User表进行比较,并将匹配项分配给“all_users”通过地图循环。
这里可能遇到的问题是表单提交是否在模型中找不到条目,然后返回“nil”。这个简单的逻辑不处理“nil”返回。