在同一控制器中获取+设置不同的实例变量

时间:2018-08-03 00:33:22

标签: ruby-on-rails ruby

我正在看一个在线项目,偶然发现了我不了解的东西。我有多个Users,每个用户都有Comments。在set_user内同时进行get_commentcomment_controller可以吗? button_to标签最终会传入用户,但只有params[:user_id]可用。

users / index.html.erb

<h3>All Users and Comments</h3>
<%= render @users %>

users / _user.html.erb

<h4><%= user.username %></h4>
<%= render user.comments %>

<%= button_to "Add comment to User", user_comments_path(user) %>

users_controller.rb

class UsersController < ApplicationController

  def index
    @users = User.order(:username)
  end

end

comments_controller.rb

class CommentsController < ApplicationController

  before_action :set_user

  def create
    @new_comment = @user.comments.create!(content: "Lorem Ipsum")
  end

  def update
    @comment.update_attributes(params.require(:comment).permit(:content))
  end

  private

    def set_user
      debugger
      @user = User.where(id: get_comment.user_id).first!
    end

    def get_comment
      @comment ||= Comment.where(id: params[:id]).first!
    end

end
  1. 我是否只想使用给定的user_id设置用户,然后create动作将创建新的Comment?那意味着我必须拥有2个before_action的权利?
  2. 此代码按原样执行update操作-因为注释存在,因此它正确获取@user@comment。为了使createupdate都可以工作,我该怎么办?

1 个答案:

答案 0 :(得分:1)

这就是我重构您的comments_controller.rb的方式:

class CommentsController < ApplicationController

  before_action :set_user
  before_action :get_comment, only: :update

  def create
    @new_comment = @user.comments.create!(content: "Lorem Ipsum")
  end

  def update
    @comment.update_attributes(params.require(:comment).permit(:content))
  end

  private

    def set_user
      debugger
      @user = User.find_by_id!(params[:user_id])
    end

    def get_comment
      @comment ||= Comment.find_by_id!(params[:id])
    end

end

如果具有用户ID,则要使用该ID来允许这两种控制器方法都起作用。您可以先执行get_comment操作,然后再运行更新方法。