Предполагая, что Ваш образцовый класс имеет атрибут заголовка, можно просто переопределить to_param метод в рамках модели, как это:
def to_param
title.downcase.gsub(/ /, '-')
end
Этот эпизод Railscast имеет все подробности. Можно также удостовериться, что заголовок только содержит допустимые символы с помощью этого:
validates_format_of :title, :with => /^[a-z0-9-]+$/,
:message => 'can only contain letters, numbers and hyphens'
Я думаю, что char
является избыточным, поскольку строка local будет иметь такое же время жизни, также попробуйте добавить программу как argv [0], как сказал Россофт в своем ответе:
const std::string arguments("arg1");
std::vector<const char*> argv;
argv.push_back("bashscriptXY");
// The string will live as long as a locally allocated char*
argv.push_back(arguments.c_str());
argv.push_back(NULL); // finish argv with zero
execve(argv[0], &argv[0], NULL);
Помните, что argv [0]
всегда является именем самой команды. Итак, если вы хотите передать 1 параметр программе, вам нужно заполнить два элемента:
argv [0]
должен быть « bashscriptXY
» (или как вам угодно ...)
argv [1] = "your_argument"
Несколько проблем:
argv
должно быть имя программы argv
может take char const *
типы, поскольку execve ()
не изменяет аргументы (хотя вызываемый процесс может - но они будут копиями в его собственном адресном пространстве). Таким образом, вы можете вставить в него строки c_str ()
. Попробуйте это:
// unfortunately, execve() wants an array of `char*`, not
// am array of `char const*`.
// So we we need to make sure the string data is
// actually null terminated
inline
std::string& null_terminate( std::string& s)
{
s.append( 1, 0);
return s;
}
// ...
std::string program = std::string( "bashscriptXY");
std::string arg1("arg1");
std::string arg2("arg2");
null_terminate(program);
null_terminate(arg1);
null_terminate(arg2);
std::vector<char *> argv;
argv.push_back( &program[0]);
argv.push_back( &arg1[0]);
argv.push_back( &arg2[0]);
argv.push_back( NULL); // finish argv with zero
intptr_t result = execve( program.c_str(), &argv[0], NULL);
Если аргументы не жестко запрограммированы, вам придется выполнить некоторое динамическое выделение памяти. Сначала создайте массив символьных указателей для количества аргументов, затем выделите память для каждого аргумента и скопируйте данные в.
Этот вопрос очень похож и включает некоторые решения кода.