Rails url路径和资源路由

我有一个具体的问题。 所以如果没有人帮助我,我会理解的。 :)无论如何,提前谢谢! 如何使用资源和restful协议重构此代码? 特别是我的意思是render_with_hashtags_of_question(text)render_with_hashtags_of_answer(text)方法和相关路线get '/questions/hashtag/:name', to: 'questions#hashtags'

问题模型:

 require 'active_support/all' class Question < ActiveRecord::Base TAG_REGEX = (/#[\p{L}_]+/) belongs_to :user belongs_to :author, class_name: 'User' has_and_belongs_to_many :tags validates :text, :user, presence: true validates :text, length: { maximum: 255 } after_save :add_hashtags after_commit do self.tags.clear add_hashtags end private def add_hashtags hashtags = self.text.scan(TAG_REGEX) hashtags << self.answer.scan(TAG_REGEX) if self.answer.present? hashtags.uniq.map do |hashtag| tag = Tag.find_or_create_by(name: hashtag.to_s.mb_chars.downcase.delete('#[]"')) self.tags << tag end end end 

question_controller.rb:

 class QuestionsController  { authorize_owner(@question.user) }, only: [:update, :destroy] def index; end def show; end def edit; end def hashtags tag = Tag.find_by(name: params[:name]) @questions = tag.questions end def create @question = Question.new(question_params) @question.author = current_user if current_user.present? if check_captcha(@question) && @question.save redirect_to user_path(@question.user), notice: 'Question was successfully created.' else render :edit end end def update if check_captcha(@question) && @question.update(question_params) redirect_to user_path(@question.user), notice: 'Question was successfully edited.' else render :edit end end def destroy user = @question.user @question.destroy redirect_to user_path(user), notice: 'Question was successfully deleted.' end private def load_question @question = Question.find(params[:id]) end def authorize_owner(user) reject_user unless user == current_user end def question_params if current_user.present? && params[:question][:user_id].to_i == current_user.id params.require(:question).permit(:user_id, :text, :answer, :tag_id, :tag, { tag_ids: [] }, :tag_ids) else params.require(:question).permit(:user_id, :text, :tag_id, :tag, { tag_ids: [] }, :tag_ids) end end def check_captcha(model) verify_recaptcha(model: model) unless current_user.present? end end 

question_helper.rb:

 require 'active_support/all' module QuestionsHelper TAG_REGEX = (/#[\p{L}_]+/) def render_with_hashtags_of_question(text) text.gsub(TAG_REGEX){ |word| link_to word, "/questions/hashtag/#{word.mb_chars.downcase.delete('#')}" }.html_safe end def render_with_hashtags_of_answer(answer) answer&.gsub(TAG_REGEX){ |word| link_to word, "/questions/hashtag/#{word.mb_chars.downcase.delete('#')}" }&.html_safe end end 

routes.rb中:

 Rails.application.routes.draw do root 'users#index' resources :users resource :session, only: [:new, :create, :destroy] resources :questions, except: [:new] , :index] get '/questions/hashtag/:name', to: 'questions#hashtags' end 

schema.rb:

 ActiveRecord::Schema.define(version: 20161227111328) do create_table "questions", force: :cascade do |t| t.string "text" t.string "answer" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "user_id" t.integer "author_id" end add_index "questions", ["user_id"], name: "index_questions_on_user_id" create_table "questions_tags", id: false, force: :cascade do |t| t.integer "question_id" t.integer "tag_id" end add_index "questions_tags", ["question_id"], name: "index_questions_tags_on_question_id" add_index "questions_tags", ["tag_id"], name: "index_questions_tags_on_tag_id" create_table "tags", force: :cascade do |t| t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "users", force: :cascade do |t| t.string "name" t.string "username" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "email" t.string "password_hash" t.string "password_salt" t.string "avatar_url" t.text "background_color" t.text "font_color" end end 

我已经努力了几天诚实地解决这个问题,但最终却一无所获。

我做了以下更改:

在QuestionsHelper中:

 def render_with_hashtags_of_question(text) text.gsub(TAG_REGEX){ |word| link_to word, tag_path(word.mb_chars.downcase.delete('#')) }.html_safe end 

并在routes.rb中:

 resources :tags, except: [:new, :destroy], param: :name