我的目标是让我的qi::grammar 返回一个属性。不过,我在使用 spirit::lexer 时遇到了很大的困难。
我希望使用下面给定的语法,如果我用 spirit::qi::parse(begin, end, grammar, output); 调用它,那么 struct ident 输出 将包含已解析的词素的内容。
错误似乎主要从这一行流出:start %= lexer.identifier;
g++ -g -c -O0 -Wall -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT reduced.cpp
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
#include <boost/spirit/home/qi.hpp>
namespace spirit = boost::spirit;
struct ident {
std::string value;
};
BOOST_FUSION_ADAPT_STRUCT(ident,
(std::string, value)
)
struct my_lexer : spirit::lex::lexer< spirit::lex::lexertl::actor_lexer<> > {
spirit::lex::token_def<std::string> identifier;
};
struct my_grammar : spirit::qi::grammar<my_lexer::iterator_type, ident()> {
my_grammar(const my_lexer & lexer) : my_grammar::base_type(start) {
start %= lexer.identifier;
}
spirit::qi::rule<my_lexer::iterator_type, ident()> start;
};
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:38:24: error: no matching constructor for initialization of 'ident'
attr = Attribute(first, last);
^ ~~~~~~~~~~~
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: in instantiation of function template specialization
'boost::spirit::traits::detail::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:106:21: note: in instantiation of function template specialization
'boost::spirit::traits::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
spirit::traits::assign_to(t, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:21:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/reference.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/reference.hpp:43:20: note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
return ref.get().parse(first, last, context, skipper, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
struct ident {
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:17:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/parser.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/domain.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/context.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/string_traits.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:368:22: error: no member named 'empty' in 'ident'
return c.empty();
~ ^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:375:47: note: in instantiation of member function 'boost::spirit::traits::is_empty_container<ident, void>::call' requested here
return is_empty_container<Container>::call(c);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:37:17: note: in instantiation of function template specialization 'boost::spirit::traits::is_empty<ident>' requested here
if (traits::is_empty(attr))
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: (skipping 7 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
最佳答案
我最终意识到我定义的结构在 spirit 上被用作元组。因为 spirit 会尝试最小化组(例如, optional<int, int> 是 optional<int> )。因此,我猜测一个 tuple<A>将转换为 A .似乎是这样。
我能够将损坏代码的测试用例进一步减少为以下内容:
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/home/qi.hpp>
#include <string>
struct ident {
std::string a;
};
BOOST_FUSION_ADAPT_STRUCT(ident,
(std::string, a)
)
int main() {
boost::spirit::qi::rule<const char*, ident()> r;
r = boost::spirit::lexeme["abc"];
}
从我发现的以下邮件列表帖子(1、2)中,我可以通过以下方式解决此问题:
r = boost::spirit::lexeme["abc"] >> boost::spirit::eps;
虽然不是很优雅,但至少解决了问题。如果其他人有方法来执行单个元素结构,我会非常感兴趣。
关于c++ - Spirit 无法将属性分配给单元素结构(或 fusion 序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770791/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2