使用RoR将参数从表单传递到控制器

时间:2017-08-19 16:48:15

标签: html ruby-on-rails ruby-on-rails-3 post

我是RoR开发的新手,对于如何将参数从HTML视图传递到控制器感到有些困惑。我在网上看到了一些使用这样的私有方法的例子:

private
def message_params
  params.require(:message).permit(:content)
end

我一直在网上寻找一些关于此方法的作用及其工作方式的澄清,但我只会遇到使用该方法的帖子/文章,而不是解释它的作用。

我希望有人可以解释该方法如何通过POST请求通过表单传递的值(/ filters?),require和permit关键字的含义以及如何更改此方法以适合我自己的使用。

例如,如果我需要获取有关新书的数据,我会这样做:

private
    def book_params
      params.require(:book_name).require(:ISBN).require(:Author).permit(:Illustrator)
    end

鉴于我的图书对象有这些字段,上述内容是否有效?

任何澄清都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

这种功能用于将参数列入白名单 - 即假设您有消息模型,并且通过控制器操作,您应该只能更改内容。也许还有一个作者字段 - 但即使有人通过表单传递它,你也不想更新它。

params.require(:message)

将返回给你params [:message]。 permit表示您只允许内容字段通过。

请参阅:http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters

我需要看看你的模型设置,但我会假设给出一个书模型,你想要更类似于:

params.require(:book).permit(:illustrator, :author, :isbn)

答案 1 :(得分:0)

这里有一些信息(我正在使用你的样本模型Book和BookController),这可能会帮助你更多地理解

当你提交表单时,rails会自动调用create方法,在create方法中你会看到Book.new(book_params),book_params将调用private方法并检查允许的字段,如果有另一个字段已提交但未列出您的许可证块然后将不会传递给保存命令

class BooksController < ApplicationController

  def create
    @book = Book.new(book_params)
    if @book.save
      flash[:success] = 'Data save successfully'
      redirect_to books_path
    else
      render :new
    end    
  end

private

  def book_params
    params.require(:book).permit(
      :book_name,
      :isbn,
      :author,
      :illustrator)
  end

end