我有一个有一个列的单词模型: word。我有一个表单,它在提交时创建一个@word对象。
words/_form.html.erb
<%= form_for(@word, :remote => (params[:action] == 'new' ? true : false)) do |f| %>
<fieldset>
<div class="field">
<%= f.text_field :word, :required => true %>
</div>
</fieldset>
<div class="actions">
<%= f.submit :disable_with => 'Submitting...' %>
</div>
<% end %>
words/create.js.erb
$('#words').prepend( '<%= escape_javascript(render @word) %>' );
$('#new-word-form-container').find('input:not(:submit),select,textarea').val('');
我想简略地说,在一个表单提交时,大量地创建多个单词(即,不必重新提交来创建每个单独的单词)。
我的Word模型中有一个方法,它将字符串拆分为一个单词数组(由逗号或空格分隔)。
class Word < ActiveRecord::Base
attr_accessible :word
# Split Words method splits words seperated by a comma or space
def self.split_words(word)
# Determine if multiple words
if word.match(/[\s,]+/)
word = word.split(/[\s,]+/) # Split and return array of words
else
word = word.split # String => array
end
end
end
我试图在我的create
操作中使用一个for循环来逐步遍历每个数组元素,并为该元素创建一个@word对象。
class WordsController < ApplicationController
respond_to :js, :json, :html
def create
split = Word.split_words(params[:word])
split.each do |w|
@word = Word.create(params[:w])
respond_with(@word)
end
end
我目前正在得到一个HashWithIndifferentAccess错误,如下所示。
Started POST "/words" for 127.0.0.1 at 2014-06-10 13:09:26 -0400
Processing by WordsController#create as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0hOmyrQfFWHRkBt8hYs7zKuHjCwYhYdv444Zl+GWzEA=", "word"=>{"word"=>"stack, overflow"}, "commit"=>"Create Word"}
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `match' for {"word"=>"stack, overflow"}:ActiveSupport::HashWithIndifferentAccess):
app/models/word.rb:9:in `split_words'
app/controllers/words_controller.rb:36:in `create'
任何帮助都是非常感谢的。
发布于 2014-06-10 11:10:27
在words控制器中的create
操作中,从params
中获取单词,这给您返回了一个parameter
对象。parameter
对象是一个类似于hash
的对象,继承自ActiveSupport::HashWithIndifferentAccess
。然后尝试调用parameter
对象上的parameter
方法,它不知道如何响应它,因此得到了一个NoMethodError
。
结帐http://api.rubyonrails.org/classes/ActionController/Parameters.html
您需要做的第一件事是传递params[:word][:word]
而不是params[:word]
,这应该会给您返回一个string
对象,这个方法现在应该可以工作了。
在each
循环中,在create
中可能会遇到另一个问题,因为params[:w]
可能返回nil
。相反,您应该传递w
,因为这将是您要迭代的array
中的每个单词,如果没有弄错,您希望为每个单词创建一个word
对象。
def create
split = Word.split_words(params[:word][:word])
@words = split.map do |w|
Word.create(word: w)
end
respond_with(@words)
end
发布于 2014-06-10 11:12:11
class WordsController < ApplicationController
respond_to :js, :json, :html
def create
@words = params[:word].split.map { |word| Word.create(word) }
respond_with(@words)
end
end
https://stackoverflow.com/questions/24147079
复制