用户从Request#Show链接到Answer#new
这可以通过sessions 或nested resources(或两者兼有!)来实现。让我解释一下:
我肯定会在您的requests 路由中添加一个嵌套资源:
#config/routes.rb
resources :requests do
resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end
这使您能够调用“嵌套”路由(即向子控制器发送数据并要求将“父”数据附加到请求的 IE 路由)。
在您的情况下,您想为 request 创建一个 answer。最有效的方法是使用如上的路由结构;这将允许您使用以下控制器方法:
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new
@request = Request.find params[:request_id]
@answer = @request.answers.new
end
def create
@request = Request.find params[:request_id]
@answer = @request.answers.new answer_params
@answer.save
end
private
def answer_params
params.require(:answer).permit(:title, :body)
end
end
通过将request_id 传递给嵌套路由,您可以创建答案。您必须注意,相应的路由需要 POST 方法才能工作。
您不需要new 方法。如果你想要的话,用上面的结构就可以轻松搞定。
传递 user 有点棘手。
你可以或者使用路由,或者设置一个会话。
我会亲自设置一个会话(它更干净):
#app/controllers/requests_controller.rb
class RequestsController < ApplicationController
def show
session[:user_id] = @user.id #-> I don't know how you populate @user
end
end
这将使您能够在此处访问此会话:
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new
user = User.find session[:user_id]
end
end
#app/views/requests/show.html.erb
<%= link_to "New Answer", request_new_answer_path(request) %>
--
如果您使用Devise,用户对象应该在current_user object 中可用(这意味着您不必设置session[:user_id]):
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new
## current_user available here if using devise
end
end
要将@user 分配给新的answer 记录,只需在answers#create 中执行此操作:
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
...
def create
@request = Request.find params[:request_id]
@answer = @request.answers.new answer_params
@answer.user = current_user
@answer.save
end
end